Maison  >  Article  >  développement back-end  >  让人不解的私有属性

让人不解的私有属性

WBOY
WBOYoriginal
2016-06-23 13:32:48986parcourir

因为用smarty,并且重新定义缓存文件夹和模板文件夹,所以在入口文件中写了这个:
$tpl->template_dir="./tpl/";
$tpl->compile_dir="./com/";

但是smarty.class.php中,这两个属性是私有的,如
 private $template_dir = array('./templates/');
/**
     * compile directory
     *
     * @var string
     */
    private $compile_dir = './templates_c/';
   



按说即然是私有属性,在入口文件中再重新赋值是不允许的,可是离奇的事发生了,却偏偏允许,难道这里还有别的机关不成


回复讨论(解决方案)

呃...我在smarty.class.php里面看见的是var,不是private 

看看类里面是否使用了 魔术方法__set之类的呢.

呃...我在smarty.class.php里面看见的是var,不是private 


我用的是smarty-3.1.24

看看类里面是否使用了 魔术方法__set之类的呢.


果然!

//   访问私有属性是通过这个方法获得的,你可以查一下文件里面的__get ,  __set;   而且我看到文件里面是protected而不是private/**    * <<magic>> Generic getter.    *    * Calls the appropriate getter function.    * Issues an E_USER_NOTICE if no valid getter is found.    *    * @param string $name property name    * @return mixed    */    public function __get($name)    {        $allowed = array(        'template_dir' => 'getTemplateDir',        'config_dir' => 'getConfigDir',        'plugins_dir' => 'getPluginsDir',        'compile_dir' => 'getCompileDir',        'cache_dir' => 'getCacheDir',        );         if (isset($allowed[$name])) {            return $this->{$allowed[$name]}();        } else {            trigger_error('Undefined property: '. get_class($this) .'::$'. $name, E_USER_NOTICE);        }    }

不知道你的 smarty 是什么版本的,但这个属性是私有的,总是有点不大对劲
如果要派生一个类的话就会遇到很多麻烦
我手边的 3.1 就是保护模式的

protected $template_dir = null;

并有魔术方法定义
   public function __set($name, $value)    {        $allowed = array(        'template_dir' => 'setTemplateDir',        'config_dir' => 'setConfigDir',        'plugins_dir' => 'setPluginsDir',        'compile_dir' => 'setCompileDir',        'cache_dir' => 'setCacheDir',        );        if (isset($allowed[$name])) {            $this->{$allowed[$name]}($value);        } else {            trigger_error('Undefined property: ' . get_class($this) . '::$' . $name, E_USER_NOTICE);        }    }

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:PHP 数组操作方法Article suivant:关于php 排序的小结