Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
__PHP中构造函数的construct()与SameAsClassName()_Php_Constructor - Fatal编程技术网

__PHP中构造函数的construct()与SameAsClassName()

__PHP中构造函数的construct()与SameAsClassName(),php,constructor,Php,Constructor,在PHP中使用\u construct()而不是构造函数的类名有什么好处吗 示例(\u构造): 示例(命名): 从PHP5开始,使用\u构造方法(第一个示例)是可能的 从PHP版本4到版本7,可以使用与类同名的方法作为构造函数(第二个示例)。PHP5中引入了\u construct。这是你现在应该做的事情。不过,我不知道这本身有什么好处 从PHP手册: 为了向后兼容,如果PHP5找不到给定类的_construct()函数,它将根据类的名称搜索旧式构造函数。实际上,这意味着唯一存在兼容性问题的情况

在PHP中使用
\u construct()
而不是构造函数的类名有什么好处吗

示例(
\u构造
):

示例(命名):

从PHP5开始,使用
\u构造
方法(第一个示例)是可能的


从PHP版本4到版本7,可以使用与类同名的方法作为构造函数(第二个示例)。PHP5中引入了
\u construct
。这是你现在应该做的事情。不过,我不知道这本身有什么好处

从PHP手册:

为了向后兼容,如果PHP5找不到给定类的_construct()函数,它将根据类的名称搜索旧式构造函数。实际上,这意味着唯一存在兼容性问题的情况是,该类有一个名为_construct()的方法,该方法用于不同的语义
如果您使用的是PHP5,我建议您使用
\uu construct
,以避免让PHP看起来像其他地方。

在PHP5中,性能会更好。它将首先查找名为
\u construct
的构造函数,如果找不到,它将查找名为
className
的构造函数。因此,如果它找到一个名为
\uu构造的构造函数,它就不需要按名称
className
搜索构造函数,我看到的前向兼容性。为了向后兼容而留在语言中的遗留代码总是有可能在将来的版本中被删除。

我同意gizmo,其优点是,如果重命名类,就不必重命名它。干的

类似地,如果您有一个子类,则可以调用

parent::__construct()
调用父构造函数。如果进一步更改子类继承自的类,则不必更改对父类的构造调用

这似乎是一件小事,但如果不更改父类的构造函数调用名称,可能会产生微妙的(但不是那么微妙的)bug

例如,如果您在继承人中插入了一个类,但忘记更改构造函数调用,那么您可以开始调用祖父母而不是父母的构造函数。这通常会导致可能难以注意到的不良结果

还要注意

从PHP5.3.3开始,与命名空间类名的最后一个元素同名的方法将不再被视为构造函数。此更改不会影响非命名空间的类


来源:

使用
\u construct()
而不是
ClassName()
的最大优点是在扩展类时。调用
parent::u construct()
比调用
parent::ClassName()
容易得多,因为它在类之间是可重用的,并且父级可以很容易地更改。

我认为主要原因是语言惯例。 你不需要强迫一种语言表现得像其他语言


我的意思是,在Objective-C中,您可以用-init作为构造函数的前缀。您可以使用类名创建自己的构造函数,但为什么?有什么理由使用这种模式而不是语言惯例吗?

今天,公认的答案已经过时了

重命名类是一种糟糕的做法:每次升级到新版本时,都必须记住重命名的内容和位置。有时(比如使用复杂的依赖结构),如果没有彻底的重构,这是不可能的。这是你想要避免的。这就是为什么名称空间被引入PHP的原因。Java、C++或C语言不使用<代码> java构造< /C>,它们使用命名构造函数,没有问题。 从PHP5.3.3开始,与命名空间的类名的最后一个元素同名的方法将不再被视为构造函数。此更改不会影响非命名空间类

示例

namespace Foo;
class Test {
  var $a = 3;

  function Test($a) {
    $this->a = $a;
  }

  function getA() {
    return $this->a;
  }
}

$test = new Test(4);
echo $test->getA(); // 3, Test is not a constructor, just ordinary function
注意,命名构造函数并没有被弃用(今天的PHP5.5)。但是,您无法预测您的类不会在名称空间中使用,因此
\uu构造
应该优先使用

澄清上述不良行为(针对丹尼斯)

在你的代码中你可以使用的地方;重命名类时,需要记住在哪里使用反射,并检查
getName()
结果在应用程序中是否仍然一致。你越需要记住一些特定的东西,就越有可能忘记一些东西,这会导致应用程序中出现错误

父母无法控制世界上所有依赖他们的班级。如果启用,则其他一些web可能正在使用服务器中的类,如果重命名某个类,则可能会崩溃。在上面提到的编译语言中情况更糟:库可以复制并绑定到其他代码中

没有理由重命名类:

  • 如果类名冲突,请使用名称空间
  • 如果类责任转移,则派生其他类
在名称空间中的PHP类中,无论如何都应该避免使用同名的方法:直观地说,它应该生成由类创建的对象;如果它做了其他事情,为什么要给它起相同的名字?它应该是一个构造函数,而不是别的。主要问题是这种方法的行为取决于名称空间的使用


PHP中的_构造构造函数没有问题。但是改变命名的构造函数并不是最聪明的主意。

如果有方法uu构造和SameAsClassName方法,那么u构造将被执行,SameAsClassName方法将被跳过。

好吧,这个问题问起已经有几年了,但我认为我
parent::__construct()
namespace Foo;
class Test {
  var $a = 3;

  function Test($a) {
    $this->a = $a;
  }

  function getA() {
    return $this->a;
  }
}

$test = new Test(4);
echo $test->getA(); // 3, Test is not a constructor, just ordinary function
class Foo {
    // PHP 4 constructor
    function Foo(){
        //do stuff
    }
}