+ -
当前位置:首页 → 问答吧 → ZenDaoPMS 中__SET问题

ZenDaoPMS 中__SET问题

时间:2011-09-22

来源:互联网


  1.     static public function setMember($objName, $key, $value)
  2.     {
  3.         global $objName;
  4.         if(!is_object($objName) or empty($key)) return false;
  5.         $key   = str_replace('.', '->', $key);
  6.         $value = serialize($value);
  7.         $code  = ("\${objName}->{$key}=unserialize(<<<EOT\n$value\nEOT\n);");
  8.         eval($code);
  9.         return true;
  10.     }
复制代码


setMember('config', $key, $value)
config 是一个仅有 一个方法的类 (非 __set() 非 __get() )


问一下 为什么  对一个 没有 __set() 方法的类 可以config->$key=$value ;
是ZenDaoPMS 中的 framework包 class  helper.class.php 1499行 . 看不懂这句.


print_r($config) 出来的是数组 var_dump($config)是一个对象.
这个config 怎么这么像 stdClass 类....
越来越糊涂了.  是不是 每个声明的基类都默认继承了 stdClass


求一个解释?????

作者: tangbao203   发布时间: 2011-09-22



1.
config 是一个仅有 一个方法的类

请分清类和对象的关系,不要混为一谈。正确的说法是“config 是一个仅有 一个方法的类所生成的实例”
2.php中的对象本来就能print_r打印,因为php里的对象是数组模拟的。
况且,从来没有人说过,print_r只能打印数组。
3.直接看代码吧
你给的代码不报错,是因为这个key在原先的类中没有或者是public的。
至于这个类到底是干啥的我不清楚,不过倒是很多php的OO代码属于一路public的“伪OO”代码
  1. class test{
  2.     private $m=888;
  3.     function say(){
  4.         echo 'say';
  5.     }
  6.     /**
  7.     public function __set($name, $value) {
  8.         $this->$name=$value;
  9.         echo "------{$name}=${value}----",PHP_EOL;
  10.     }
  11.     **/
  12. }
  13. $o=new test;
  14. $o->m='123';
  15. print_r($o);
复制代码

4.自定义类和stdclass没有所谓的继承关系,而是当把一个标量转为对象时,对象默认是stdclass的实例。
stdclass不是基类。is_subclass_of,instanceof,get_parent_class等函数可以帮助你理清类之间,对象和类之间的关系。
可自己动手验证。
5.学习手册和面向对象

作者: iminto   发布时间: 2011-09-22

相关阅读 更多