2014-11-21 39 views
0

我很好奇为什么这是允许工作的,因此您可以从对象作用域之外调用并成功执行对象上的私有方法,只要您使用相同类型的类进行调用即可。为什么你可以从对象范围之外调用私有方法?

从公共范围到我的私有方法调用似乎不符合私有方法的标准,那么为什么在PHP和Java中都允许这样做呢?

<?php 

class A 
{ 

    public function publicMethod() 
    { 
     $obj = new static; 
     $obj->privateMethod(); 
    } 

    private function privateMethod() 
    { 
     echo 'why does this execute?'; 
    } 

} 

$obj = new A; 
$obj->publicMethod(); 
+7

你不能从外部调用它,你在同一个对象的方法调用它。 – Popnoodles 2014-11-21 17:02:34

+1

@Popnoodles它不是同一个对象。 publicMethod中的$ obj和外部区域中的$ obj是不同的变量(一个是全局的,一个是局部的..参见[Variable Scope](http://php.net/manual/en/language.variables。 scope.php)在PHP手册中)。即使它们是同一个变量,您也可以清楚地看到$ obj正在publicMethod中设置为A的新实例。 – Powerlord 2014-11-21 17:34:49

+0

不考虑语义,私有方法是从公共方法私下调用的;这不是公开呼吁。如果公共方法不能访问私有方法,是不是会使私有方法变得冗余? – Popnoodles 2014-11-21 18:14:56

回答

0

对象将有机会获得对方私人和受保护的成员,尽管他们不是同一个实例。这是因为实现特定的细节在这些对象内部时是已知的。

- Visiblity,PHP手册

0

Private修饰符定义您调用本地作用域中的属性或方法由此我的意思是同一个类。 虽然它自己的类是唯一的来电者,你可以在一个公共的方法使用它,然后调用本地范围以外的公共方法(所有者类)相同类型的

相关问题