首先,引用PHP手册(http://php.net/manual/en/keyword.extends.php):
The extended or derived class has all variables and functions of the
base class (this is called 'inheritance' despite the fact that nobody
died) and what you add in the extended definition.
那么为什么这个简单的例子不起作用:
<?php
class A
{
private function a()
{
echo 'a';
}
public function b()
{
echo 'b';
}
}
class B extends A
{
//no extended definition, only what's inherited
}
$object_B = new B();
echo $object_B->b(); // fatal error: Call to private A::a() from invalid context
?>
经过一些实验,结果发现从A类中删除方法a 使它工作。我甚至都没有在任何地方打电话。
答案 0 :(得分:3)
您可以使用与具有PHP类的构造函数同名的方法。因此,您的方法a
充当A类的构造函数。
重命名您的方法,它应该有效:
class First
{
private function another()
{
echo 'a';
}
public function b()
{
echo 'b';
}
}
答案 1 :(得分:0)
“不推荐使用:与其类名相同的方法将不会是PHP的未来版本中的构造函数” - 在执行示例代码后报告PHP 7。
我认为您不能将该方法命名为与该类相同的名称。在较旧的PHP版本中,您可以通过命名类的方法来定义类的构造函数。 PHP假定函数a是构造函数。所以它不会那样工作。
与Zac Brown说的一样,你必须使用__construct()方法。
答案 2 :(得分:0)
在A类中,您已经使用相同的类名定义了一个()方法。所以它是A类的构造方法。但在PHP中你不能使用私有构造函数方法。你的代码应该是这样的。
<?php
class A
{
public function a()
{
echo 'a';
}
public function b()
{
echo 'b';
}
}
class B extends A
{
//no extended definition, only what's inherited
}
$object_B = new B();
echo $object_B->b();
答案 3 :(得分:0)
以下是澄清:
您正在String.Split()
中定义method a()
。它们具有相同的名称,因此Class A
被视为method a()
的{{1}}。因此,当您在constructor
中初始化Class A
时,自Class B
扩展$object_B = new B();
并调用Class A
方法后,您也会初始化A
。因为具有构造函数方法的类在每个新创建的对象上调用此方法 PHP Constructor。因而错误。
我相信这澄清了你的疑问。