我在PHP5.3中有一个奇怪的行为
我有课要讲这个
$new = new self($data);
$new->setServiceManager($this->service);
$new->cacheInstance();
但是函数cacheInstance是一个私有函数。。。。
private function cacheInstance()
{
foreach ($this->data as $name => $class) {...}
}
有人能解释一下为什么会这样用吗?这个方法不应该是私有的,也不应该是外部无法访问的吗?
更新:
好吧,现在我完全迷路了。。。我甚至可以访问实例的私有变量。。。比如说。。。这一定是有意为之,有人能给我指个方向吗?
如果你可以用new Self()创建一个类实例,这意味着你在这个类中,当然你可以访问私有属性和函数。这个片段取自PHP文档(链接)
/**
* Define MyClass
*/
class MyClass
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj = new MyClass();
echo $obj->public; // Works
echo $obj->protected; // Fatal Error
echo $obj->private; // Fatal Error
$obj->printHello(); // Shows Public, Protected and Private
就你而言:
class Cache {
private $service = null;
private function cacheInstance()
{
foreach ($this->data as $name => $class) {}
}
public function setServiceManager( $service ) {
}
public function myTest( $data ) {
$new = new self( $data );// you are in the class, so you can call new self()
$new->setServiceManager($this->service);
$new->cacheInstance();
}
}
$cache = new Cache();
$cache->service; //Fatal error: Cannot access private property
$data = array();
$cache->myTest( $data );// working
$cache->cacheInstance();// not working
private
、protected
和public
可访问性在类级别工作,而不是在对象级别工作。
虽然这似乎与直觉相反,但这并不是您通常的PHP怪异之处。
请注意,可访问性是一个静态属性,可以在编译时确定;它只取决于类型和声明修饰符。
私有关键字是成员访问修饰符。私有访问是最不允许的访问级别。私有成员只能在类的主体或声明它们的结构中访问
(新增亮点)
可访问性是一种机制,用于对其他类中的代码隐藏实现细节,而不是封装对象。或者正如Java规范中所述,可访问性可以在编译时确定,也就是说,不能因为它是不同的对象而存在运行时冲突。
如果你看看私有和受保护之间的区别,这是有道理的。对于私有成员,如果对象在父类中声明了自己的成员,则对象无权访问这些成员。听起来怪怪的?那是因为术语不对。该类不能访问其父类的私有部分(即它可能不使用它们)。
现在在方法中,在同一个类中使用私有变量。无论运行时的对象是什么,都不需要对这个类的作者自己隐藏这个实现细节。
好啊就像量子力学一样。。。已在RL中指出答案
http://php.net/manual/en/language.oop5.visibility.php
引用:
相同类型的对象可以访问彼此的私有成员和受保护成员,即使它们不是相同的实例。这是因为实现特定的细节在这些对象内部时已经知道了。
谈论维尔德。。。