【问题标题】:Is there a difference between instantiation with parentheses or without?带括号或不带括号的实例化有区别吗?
【发布时间】:2015-05-08 23:20:51
【问题描述】:

这两段代码有什么区别?

<?php

    $object1 = new User();
                     //^^
    $object1->name = "Hello";        
    echo $object1->name;
    class User {}

?>

还有:

<?php

    $object1 = new User;
                    //^
    $object1->name = "Hello";        
    echo $object1->name;
    class User {}

?>

我得到相同的输出:

Hello

如果我在以下位置使用括号有什么区别:

$object1=new User;

【问题讨论】:

  • 没有任何区别......如果您需要将任何参数传递给构造函数,则在实例化新类实例时只需要括号......就个人而言,我更喜欢总是使用括号,因为它使该行在我的编辑器中更加突出
  • 在第一个中,您使用了可选的括号。你为什么不读一本 PHP 书..
  • @TonyHopkinson 实际上我正在阅读 PHP 书籍并看到代码示例,有时作者使用括号,有时不使用,我想有什么区别
  • 无,无括号 = 无参数,空括号 = 无参数。如果您将编程语言视为用户界面,那么设计者并不想强迫您一直使用空的,或者永远不要使用空的。编程的一个非常重要的部分是意图。通过以这种方式对解析器进行编码,设计者在形式上有所不同,而不是在实质上。哦,如果它是一本不错的书,它应该能够回答你的问题..
  • @TonyHopkinson Learning PHP, MySQL & JavaScript: With jQuery, CSS & HTML5 4th edition by Robin Nixon

标签: php oop instance


【解决方案1】:

完全相同,你可以比较这两个脚本的操作码:

1 个脚本:

$object1=new User();
$object1->name="Hello";        
echo $object1->name;
class User {}

操作码:

line     # *  op                           fetch          ext  return  operands
---------------------------------------------------------------------------------
   3     0  >   FETCH_CLASS                                   4  :0      'User'
         1      NEW                                              $1      :0
         2      DO_FCALL_BY_NAME                              0          
         3      ASSIGN                                                   !0, $1
   4     4      ASSIGN_OBJ                                               !0, 'name'
         5      OP_DATA                                                  'Hello'
   5     6      FETCH_OBJ_R                                      $5      !0, 'name'
         7      ECHO                                                     $5
   6     8      NOP                                                      
         9    > RETURN                                                   1

2 脚本:

$object1=new User;
$object1->name="Hello";        
echo $object1->name;
class User {}

操作码:

line     # *  op                           fetch          ext  return  operands
---------------------------------------------------------------------------------
   3     0  >   FETCH_CLASS                                   4  :0      'User'
         1      NEW                                              $1      :0
         2      DO_FCALL_BY_NAME                              0          
         3      ASSIGN                                                   !0, $1
   4     4      ASSIGN_OBJ                                               !0, 'name'
         5      OP_DATA                                                  'Hello'
   5     6      FETCH_OBJ_R                                      $5      !0, 'name'
         7      ECHO                                                     $5
   6     8      NOP                                                      
         9    > RETURN                                                   1

【讨论】:

  • 展示与 vld 的差异绝对是一个奖励
  • 这是一个答案!我很难满足最少 30 个字符的要求 :)
  • 查看操作码需要一个特殊的扩展名为Vulcan Logic Dumper
  • @BsD 正如 Mark Ba​​ker 所说,您需要此扩展 ^ 或者对于您可以使用的小脚本:3v4l.org
【解决方案2】:

两者相等。如果您不使用任何代码约定,请使用您喜欢的。我认为$object1 = new User()$object1 = new User 有用。如果您将参数传递给构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    相关资源
    最近更新 更多