【发布时间】:2011-10-06 10:39:46
【问题描述】:
只是想知道最好是定义一个空的构造函数还是将构造函数定义完全留在 PHP 中?我习惯于只用return true; 定义构造函数,即使我不需要构造函数做任何事情——只是为了完成的原因。
【问题讨论】:
标签: php constructor
只是想知道最好是定义一个空的构造函数还是将构造函数定义完全留在 PHP 中?我习惯于只用return true; 定义构造函数,即使我不需要构造函数做任何事情——只是为了完成的原因。
【问题讨论】:
标签: php constructor
如果您不需要构造函数,最好将其省略,无需编写更多代码。当你写的时候,把它留空……返回 true 没有目的。
【讨论】:
两者之间有区别:如果您编写一个空的__construct() 函数,则会覆盖从父类继承的任何__construct()。
因此,如果您不需要它并且不想显式覆盖父构造函数,则根本不要编写它。
【讨论】:
编辑:
以前的答案不再有效,因为 PHP 现在的行为与其他 oop 编程语言一样。 构造函数不是接口的一部分。因此,您现在可以按照自己的喜好覆盖它们,而不会出现任何问题
唯一的例外是:
interface iTest
{
function __construct(A $a, B $b, Array $c);
}
class Test implements iTest
{
function __construct(A $a, B $b, Array $c){}
// in this case the constructor must be compatible with the one specified in the interface
// this is something that php allows but that should never be used
// in fact as i stated earlier, constructors must not be part of interfaces
}
以前的旧答案不再有效:
空构造函数和根本没有构造函数之间有一个重要区别
class A{}
class B extends A{
function __construct(ArrayObject $a, DOMDocument $b){}
}
VS
class A{
function __construct(){}
}
class B extends A{
function __construct(ArrayObject $a, DOMDocument $b){}
}
// error B::__construct should be compatible with A constructor
【讨论】:
A 有一个已定义的构造函数,而B 有一个已定义的空构造函数,那么您实际上是在删除该构造函数,但如果您完全忽略它然后你继承父构造函数。结果是你不应该“总是”或“从不”包含一个空的构造函数,当你做一个或另一个时,它并不“总是”意味着同样的事情。一切都与上下文有关。
如果你的对象永远不应该被实例化,你应该只定义一个空的构造函数。如果是这种情况,请将 __construct() 设为私有。
【讨论】:
构造函数总是返回其定义的类的实例。因此,您永远不会在构造函数中使用“return”。最后,如果你不打算使用它,最好不要定义它。
【讨论】:
您可能想要定义空构造函数的一个原因是当您想要避免调用具有相同类名的函数时。
class FooBar {
function foobar() {
echo "Hello world";
}
}
new FooBar(); // outputs "Hello world" in PHP < 8
这是由于 PHP 4 向后兼容,其中构造函数具有相同的类名。 无论如何,它在 PHP 7.4.26 中已被弃用。
class FooBar {
function __construct() {
}
function foobar() {
echo "Hello world";
}
}
new FooBar(); // no output
【讨论】: