Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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中扩展类-奇怪的行为_Php_Oop_Inheritance - Fatal编程技术网

在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手册():

那么,为什么这个简单的例子不起作用:

<?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();