在PHP中扩展类-奇怪的行为
首先,引用PHP手册(): 那么,为什么这个简单的例子不起作用:在PHP中扩展类-奇怪的行为,php,oop,inheritance,Php,Oop,Inheritance,首先,引用PHP手册(): 那么,为什么这个简单的例子不起作用: <?php class A { private function a() { echo 'a'; } public function b() { echo 'b'; } } class B extends A { //no extended definition, only what's inherited }
<?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
?>
您可以使用与PHP类的构造函数同名的方法。因此,您的方法a
充当类a的构造函数
重命名您的方法,它应该可以工作:
class First
{
private function another()
{
echo 'a';
}
public function b()
{
echo 'b';
}
}
请参见“弃用:在PHP的未来版本中,与类同名的方法将不会成为构造函数”——执行示例代码后报告PHP7
我认为不能用与类相同的名称命名方法。在旧的PHP版本中,可以通过像类一样命名方法来定义类的构造函数。PHP假定函数a是构造函数。所以它不会那样工作
正如Zac Brown所说,您必须使用_construct()方法。在类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();
以下是澄清:
您正在类a
中定义方法a()。它们具有相同的名称,因此方法a()
被视为类a
的构造函数。因此,当您在$object_B=new B()中初始化类B
时
,您也可以初始化类A
,因为A
正在扩展B
,并且调用了构造函数
方法。因为具有构造函数方法的类对每个新创建的对象调用此方法。这就是错误
我相信这澄清了你的疑问。事实上,我不想做构造函数:)从PHP7开始,_构造是编写它们的唯一正确方法。我想写一个简单的方法来测试继承。我根本没有想到我对方法和类名使用了相同的名称(方法名为a,类名为a),我认为这样的错误一直在发生,因为在PHP中区分大小写是不一致的,这就是为什么我建议您更改a
方法的名称。这是关于PHP的一些鲜为人知的“怪癖”之一。在PHP7中,你是对的。然而,大多数环境还没有使用7,所以这仍然是需要记住的。我的回答回答了你的问题吗?:)是的,我接受了你的回答。但为了进一步澄清,因为我已经浪费了很多时间试图弄明白这一点(我可能很快就会忘记它):1。在PHP2中,函数名、方法名和类名不区分大小写。变量名、常量名、类属性和类常量在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();