Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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_Visibility - Fatal编程技术网

php手动可见性示例

php手动可见性示例,php,visibility,Php,Visibility,我对php手册中的一个示例感到困惑。这是关于能见度的。这是一个例子 class Bar { public function test() { $this->testPrivate(); $this->testPublic(); } public function testPublic() { echo "Bar::testPublic\n"; } private function testPriv

我对php手册中的一个示例感到困惑。这是关于能见度的。这是一个例子

class Bar {
    public function test() {
        $this->testPrivate();
        $this->testPublic();
    }
    public function testPublic() {
        echo "Bar::testPublic\n";
    }
    private function testPrivate() {
        echo "Bar::testPrivate\n";
    }
}
class Foo extends Bar {
    public function testPublic() {
        echo "Foo::testPublic\n";
    }
    private function testPrivate() {
        echo "Foo::testPrivate\n";
    }
}
$myFoo = new foo();
$myFoo->test();  
?>

此示例输出

Bar::testPrivate 
Foo::testPublic
请你解释一下这是怎么发生的

为什么不同时调用
testPublic()

我在Bar类构造中放置了一个
变量转储($this)
。它打印
对象(Foo)[1]
。我知道私有属性可以用同一个类调用


那么“
Bar::testPrivate
”是如何调用的?
Private
并不意味着您不能调用它。这意味着您只能从当前类调用它
Public
意味着您可以从任何类调用它

要调用
Bar::testPrivate
,请尝试以下操作:

$Bar->testPublic();

但是,您不能调用
$Bar->testPrivate()
,因为该方法是
private

那么如何调用“Bar::testPrivate”

调用
$myFoo->test()
时,它会在
Bar
的上下文中运行代码,因为
Foo
类没有覆盖它

Bar::test()
内部,当调用
$this->testPrivate()
时,解释器将首先查看
Foo
,但该方法是私有的(并且不能从
Bar
调用子类的私有方法),因此它会上升一级,直到找到合适的方法;在本例中,这将是
Bar::testPrivate()

相反,当调用
$this->testPublic()
时,解释器会立即在
Foo
中找到合适的方法并运行它

编辑

为什么两个testPublic()都不被调用

当您运行
$this->testPublic()
时,只调用一个方法,这是距离基类最远的一个方法


如果
Foo::testPublic()
还需要执行父级的实现,则应在该方法内编写
parent::testPublic()

您的函数位于
类中,您正在使用神奇的
$this
指针调用成员函数

尝试将函数
test()
移动到
Foo
类,看看会发生什么。输出应为:

Foo::testPrivate
Foo::testPublic
在您的示例中,调用了Bar的私有函数,因为它仅适用于该类。Foo类中没有
test
函数,因此
Bar
类中的test函数没有调用它们的权限

然后,由于函数重载,调用了类
Foo
的公共函数而不是
Bar

两个类都有一个同名函数,因此子类的函数很重要。

您调用

$myFoo->test();
参见功能
测试

public function test() {
    $this->testPrivate();
    $this->testPublic();
}
当对
Bar
类(包括继承的类)的实例调用此函数时,它将调用
testPrivate
testPublic

这些方法在类
Foo
中被重写,这意味着使用
Foo
的方法。始终可以调用基类的方法:

// in Foo
public function testPublic() {
    parent::testPublic();
    echo "Foo::testPublic\n";
}    
之所以调用
Bar::testPrivate
,是因为它是
private
,并且未被
Foo::testPrivate
覆盖


请参阅更多信息。

类Foo扩展了类栏。然后调用函数测试,它在Bar中定义。在这个函数中有两个调用。一个是公共函数,一个是类栏中的私有函数。

我猜用户“omega at 2093 dot es”(omega at 2093 dot es)的注释描述了同样的事情。 据说:“父类中定义的方法不能访问从它们继承的类中定义的私有方法。但是,它们可以访问受保护的方法。”

在您的例子中,
Bar::test()
方法中的
对象是
Foo
类型(您的var\u转储证明了这一点)。因为
Foo::testPrivate()
方法是私有的,所以不能从父类Bar访问它,唯一可以访问的方法仍然是
Bar::testPrivate()
(尝试注释定义,您将得到致命错误)。这就是为什么第一个输出是
Bar::testPrivate

$this->testPublic()
调用
Foo::testPublic()
方法,因为
$this
属于
Foo
类型,并且方法定义为public

简而言之,私有方法只能从定义它们的类访问。既不能从子类也不能从父类访问它们


要使该方法可从子类或父类访问,请使其受保护。例如,如果将
testPrivate()
方法设置为在两个类中都受保护,它将打印
Foo::testPrivate Foo::testPublic

这并不能回答问题。抱歉,误解了问题。修正了。+1,为什么不能调用
Foo
testPrivate()
?因为它是私有的,你不希望父母触碰他们孩子的隐私,是吗?我想,关于
testPublic()
的部分困惑是,PHP进行替换覆盖而不是细化覆盖。这意味着PHP不会在子对象中调用父对象的方法,除非您明确要求它这样做(例如:
parent::testPublic();
)。你解释得很好。现在我明白了。因为$this指的是foo,所以我认为应该调用foo类的私有函数。这是我弄糊涂的一点。
// in Foo
public function testPublic() {
    parent::testPublic();
    echo "Foo::testPublic\n";
}