PHP如何实现$this->[类库名称]->[类库方法]。

使用过CI框架,发现在控制器中加载模型很方便,直接使用$this->my_model_name->my_method(),即$this->[类库名称]->[类库方法];
我在自己搭建的一个框架中也想达到同样效果,但是失败,只能将new出来的类库存入属性中,再使用$this->model->my_method(),即$this->[类属性名]->[类库方法]。

考虑过使用可变变量,将传入的类库名存入属性中,然后将new出来的对象存入该属性的可变变量中,这样$this->类库名 就相当于$this->属性名了,都能得到new出来的对象,但是报错:

class A
{
    public $libaray;

    public function load($className)
    {
        //将类库名存入属性
        $this->libaray = $className;
        //获取类库的文件名/命名空间
        $class = $className.'.php';
        //将new出来的类库存入$libaray
        $this->$libaray = new $class;
    } 
}

但是这样会报错,提示未定义变量$libaray,也就是在利用可变变量这里出错。是我对可变变量理解有问题吧?官方文档中说明:http://php.net/manual/zh/lang...

注意,在 PHP 的函数和类的方法中,超全局变量不能用作可变变量。$this 变量也是一个特殊变量,不能被动态引用。

这说明$this不能使用动态变量?

阅读 2.9k
3 个回答

可以使用PHP的魔术方法, 覆盖 $this->lib_name 这个属性获取方法

具体可以看这个官方文档地址: Property overloading

class Loader {
  private $libs = [];
  public function __get($name) {
    if (isset($this->libs[$name])) {
      return $this->libs[$name];
    }
  }

  public function load($name) {
    require_once('class/path/to/'.$name);
    $this->libs[$name] = new $name();
  }
}

如果要支持isset()判断和unset(), 而且实现对应的魔术方法即可

错误太多

  1. php没有 new xxx.php的用法

  2. 实例变量library的调用方式是 $this->library,不是$this->$library

class A
{
    public $libaray;

    public function load($className)
    {
        //将new出来的类库存入$libaray
        $this->libaray = new $className;
    } 
}

我知道你代码想要的效果,给这个$library加个括号就行了

class a{
    function load($cls){
        $this->{$cls} = new $cls();
    }    
}
class b{
    public $cc = '123';
}

$a = new a();
$a->load('b');
echo $a->b->cc;
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题