php中一个成员权限困惑 php 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 纠正一下,private时打印的结果如下:Son Object( [a:Son:private] => [arr:protected] => Array ( [a] => 1 ) [bb] => 1) son::a 是私有的,far:: init 访问不到他 不是有个__set魔术方法么? __set 不是 far 的吗? 子类不是继承了它么?$Son->bb = 1;可以证明 Son得到了Far的__set 是的,那么__set中的$this不是指向的当前实例对象,也就是Son的一个实例哦。而__set的作用就是可以用于访问private或不存在的成员, Sorry,$bb是我外部加的,如下:$obj = new Son();$obj->bb = 1;print_r($obj); private 是私有属性,只能自己内部调用,实例都不可以调用。当然Far不可以赋值,正常的。 呃,我的意思是,__set, __get方法其实就是用来访问其中不存在或私有private的成员的方法。手册中如下说明:“在给不可访问属性赋值时,__set() 会被调用。”参见:http://www.php.net/manual/zh/language.oop5.overloading.php 你的 __set 方法是定义在 Far 中的,所以他不能访问 Son 的私有属性这样写就可以了class Far { protected $arr; protected function init() { foreach ($this->arr as $k => $val) { $this->$k = $val; } } public function __construct() { $this->init(); } public function __set($name, $val) { $this->$name = $val; }}class Son extends Far { private $a; public function __construct() { $this->arr = array( 'a' => '1', ); parent::__construct(); } public function __set($name, $val) { $this->$name = $val; }}$obj = new Son();print_r($obj);Son Object( [a:Son:private] => 1 [arr:protected] => Array ( [a] => 1 )) 是的,我之所以写在父类中,就是不想在每个子类中写一个__set,按您所说的是没有问题的。不过让我不明白的是,即然它能从父类得到这个__set的方法。与写在自己内部的__set方法,在操作成员时,倒底有什么不同的。 有一点我不明白的是,如果我在__set打印当前$this,这里我得到的是子类对象。那接着$this->name不就是子类对象的方法操作自己的成员么?为可这里权限却没有了。 php调用多个数据库 php数据库备份 一个很奇怪的问题 小问题,,大给分,,快近来看看! EBB论坛正式提供下载 数据库读出的文本开头的空格为什么不能显示? 怎么进入mysql 网页留言板! 紧急问题,请问!在PHP+SQL SERVER中怎样实现分页? 有谁做过预约挂号医生排班的程序,给个思路。 php连接sql失败 怎么用正则获取到这个href?
Son Object
(
[a:Son:private] =>
[arr:protected] => Array
(
[a] => 1
) [bb] => 1
)
不是有个__set魔术方法么?
子类不是继承了它么?
$Son->bb = 1;
可以证明 Son得到了Far的__set
$obj->bb = 1;
print_r($obj);
当然Far不可以赋值,正常的。
呃,我的意思是,__set, __get方法其实就是用来访问其中不存在或私有private的成员的方法。手册中如下说明:
“在给不可访问属性赋值时,__set() 会被调用。”参见:http://www.php.net/manual/zh/language.oop5.overloading.php
这样写就可以了class Far {
protected $arr;
protected function init() {
foreach ($this->arr as $k => $val) {
$this->$k = $val;
}
} public function __construct() {
$this->init();
} public function __set($name, $val) {
$this->$name = $val;
}
}class Son extends Far {
private $a;
public function __construct() {
$this->arr = array(
'a' => '1',
);
parent::__construct();
}
public function __set($name, $val) {
$this->$name = $val;
}
}$obj = new Son();
print_r($obj);Son Object
(
[a:Son:private] => 1
[arr:protected] => Array
(
[a] => 1
))
是的,我之所以写在父类中,就是不想在每个子类中写一个__set,按您所说的是没有问题的。不过让我不明白的是,即然它能从父类得到这个__set的方法。与写在自己内部的__set方法,在操作成员时,倒底有什么不同的。
有一点我不明白的是,如果我在__set打印当前$this,这里我得到的是子类对象。那接着$this->name不就是子类对象的方法操作自己的成员么?为可这里权限却没有了。