Php $new=新自我($data);使用私有函数甚至变量oO?
我在PHP5.3中有一个奇怪的行为 我有一个类,它在一个函数中Php $new=新自我($data);使用私有函数甚至变量oO?,php,oop,scope,stdclass,Php,Oop,Scope,Stdclass,我在PHP5.3中有一个奇怪的行为 我有一个类,它在一个函数中 $new = new self($data); $new->setServiceManager($this->service); $new->cacheInstance(); 但是函数cacheInstance是一个私有函数 private function cacheInstance() { foreach ($this->data a
$new = new self($data);
$new->setServiceManager($this->service);
$new->cacheInstance();
但是函数cacheInstance是一个私有函数
private function cacheInstance()
{
foreach ($this->data as $name => $class) {...}
}
有人能解释一下为什么会这样用吗?这个方法不应该是私有的,也不应该是外部无法访问的吗
更新:
好吧,现在我完全迷路了。。。我甚至可以访问实例的私有变量。。。比如说。。。这一定是某种预期的行为,有人能告诉我一个方向吗?如果你能用new self()创建一个类实例,那就意味着你在类中,当然你可以访问私有属性和函数。此代码段取自PHP文档() 就你而言:
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
好的。。。就像量子力学一样。。。已在RL中指出答案 引述: 同一类型的对象将具有相互访问的权限,并且是私有的 受保护的成员,即使它们不是相同的实例。这是 因为特定于实现的详细信息在 在那些物体里面
谈论维尔德
private
、protected
和public
可访问性在类级别工作,而不是在对象级别
虽然首先看起来似乎有悖常理,但这并不是您通常的PHP怪癖
在其他OOP语言中也是一样的,比如
请注意,可访问性是一个静态属性,可以在编译时确定;它只依赖于类型和声明修饰符
和
private关键字是成员访问修饰符。私有访问是最低权限的访问级别。私有成员只能在声明它们的类或结构体中访问
(新增亮点)
解释
可访问性是一种机制,用于对其他类中的代码隐藏实现细节,而不是封装对象。或者正如Java规范中所述,可访问性可以在编译时确定,也就是说,不能因为它是不同的对象而存在运行时冲突
如果你看一下私有和受保护之间的区别,这是有道理的。对于私有成员,如果在父类中声明了自己的成员,则对象无权访问这些成员。听起来怪怪的?那是因为术语是错误的。类无权访问其父类的隐私(即,它可能不使用这些隐私)
现在在方法中,在同一个类中使用私有变量。无论运行时的对象是什么,都不需要对这个类的作者自己隐藏这个实现细节。
new self()
当然表示您在那个类中。因为你在类/对象中,所以你可以访问它的私有。你能提供更多的代码吗,因为现在我看不出有什么问题。如果你能用new self()创建一个新实例,这意味着你在类上下文中,所以在我看来一切都很好。听起来好像类在调用构造函数,而不是函数。谢谢。有道理。。。以一种奇怪的方式:P
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