我的php 5.3中有一个奇怪的行为
我在一个函数
中有一个类 $new = new self($data);
$new->setServiceManager($this->service);
$new->cacheInstance();
但函数cacheInstance是一个私有函数....
private function cacheInstance()
{
foreach ($this->data as $name => $class) {...}
}
有人可以解释为什么这样可以这样使用吗?这个方法不应该是私人的,也不能从外面进入吗?
更新:
好吧现在我完全迷失了......我甚至可以访问实例的私有变量......就像......这必须是某些预期的行为,可以让我指向一个方向吗?
答案 0 :(得分:3)
如果您可以使用new self()创建一个类实例,则意味着您在该类中,当然您可以访问私有属性和函数。此代码段取自PHP文档(link)
/**
* 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
答案 1 :(得分:1)
private
,protected
和public
辅助功能适用于类级别,而不适用于对象级别。
虽然它首先看起来似乎是反直觉的,但这不是你平常的PHP怪异。
请注意,辅助功能可以在编译时确定的静态属性;它仅取决于类型和声明修饰符。
private关键字是成员访问修饰符。私有访问是最不宽容的访问级别。私有成员只能在类的主体或声明它们的结构中访问
(已添加精选)
可访问性是一种从其他类中的代码隐藏实现细节的机制,而不是用于封装对象。或者正如Java规范中所述,可访问性可以在编译时确定,即不存在运行时违规,因为它是一个不同的对象。
如果你看看私人和受保护之间的区别,这是有道理的。对于私有成员,如果在父类中声明对象,则该对象无权访问其自己的成员。听起来怪怪的?那是因为术语错了。 类无法访问其父类的私有(即它可能不会使用它们)。
现在在您的方法中,您在同一个类中使用私有变量。无论对象在运行时是什么,都无需隐藏本类作者自己的实现细节。
答案 2 :(得分:0)
http://php.net/manual/en/language.oop5.visibility.php
QUOTE:
相同类型的对象可以私密访问彼此 受保护的成员,即使它们不是相同的实例。这是 因为实现具体细节已经知道了 在那些物体里面。
谈论奇怪......