与使用PHP中的use函数直接调用类有什么区别?

时间:2018-12-14 03:54:51

标签: php

与直接调用类或在顶部使用类有什么区别?

情况1:

use Carbon\Carbon;

...

public function __construct() {

    echo Carbon::now();
}

案例2

public function __construct() {

    echo \Carbon\Carbon::now();
}

哪个更好?也许是从成本/加载时间或其他方面?我知道case 1更加干净,但是我认为两者都有很多优点和缺点。

也许有人已经问过这个问题,但是对不起,我不知道关键字是什么,所以我将在这里询问。谢谢!

2 个答案:

答案 0 :(得分:1)

最终操作码会有所不同。第一种情况比第二种情况具有更多的操作码指令。这意味着第一种情况在执行期间将比第二种情况占用更多资源。

但坦率地说,案例1看起来更简洁易读。

这些情况下的操作码如下。

案例1

function name: (null)
L1-12 {main}() /tmp/test/2.php - 0x7fface082140 + 5 ops
 L2    #0     NOP                                                                                   
 L3    #1     NOP                                                                                   
 L5    #2     EXT_STMT                                                                              
 L5    #3     NOP                                                                                   
 L12   #4     RETURN<-1>              1                                                            

user class: another\App
1 methods: __construct

function name: __construct
L7-10 another\App::__construct() /tmp/test/2.php - 0x7fface0668c0 + 9 ops
 L7    #0     EXT_NOP                                                                               
 L9    #1     EXT_STMT                                                                              
 L9    #2     INIT_STATIC_METHOD_CALL "Carbon\\Carbon"     "now"                                    
 L9    #3     EXT_FCALL_BEGIN                                                                       
 L9    #4     DO_FCALL                                                          @0                  
 L9    #5     EXT_FCALL_END                                                                         
 L9    #6     ECHO                    @0                                                            
 L10   #7     EXT_STMT                                                                              
 L10   #8     RETURN<-1>              null 

案例2

function name: (null)
L1-11 {main}() /tmp/test/1.php - 0x7f2e3c493000 + 4 ops
 L2    #0     NOP                                                                                   
 L4    #1     EXT_STMT                                                                              
 L4    #2     NOP                                                                                   
 L11   #3     RETURN<-1>              1                                                             


user class: another\App
1 methods: __construct

function name: __construct
L6-9 another\App::__construct() /tmp/test/1.php - 0x7f2e3c466780 + 9 ops
 L6    #0     EXT_NOP                                                                               
 L8    #1     EXT_STMT                                                                              
 L8    #2     INIT_STATIC_METHOD_CALL "Carbon\\Carbon"     "now"                                    
 L8    #3     EXT_FCALL_BEGIN                                                                       
 L8    #4     DO_FCALL                                                          @0                  
 L8    #5     EXT_FCALL_END                                                                         
 L8    #6     ECHO                    @0                                                            
 L9    #7     EXT_STMT                                                                              
 L9    #8     RETURN<-1>              null 

答案 1 :(得分:-1)

这是我的主意。

use Carbon\Carbon;

...

public function __construct() {

    echo Carbon::now();
}

在上面的示例中,构造函数是tightly coupled,类为Carbon\Carbon。在这种情况下,很难扩展该类。

类似地,在情况2中,类Carbon\Carbon也与构造函数紧密耦合。

但是,还有第三种情况。在这种情况下,您需要将类Carbon\Carbon注入到名为dependency injection的构造函数中。与前两种方法相比,这是更可靠和推荐的方法,因为在这种情况下,该类不再与类Carbon\Carbon紧密结合。这是上面的示例在这种情况下的样子,

public function __construct(\Carbon\Carbon $carbon) {

    echo $carbon::now();
}