使用object属性作为类名来静态调用方法?

时间:2015-01-20 16:18:42

标签: php oop

所以我有一个班级Son的对象:

class Son extends Father {
    $_modelName = 'House';
}

另一个班级Daughter

class Daughter extends Father {
    $_modelName = 'Museum';
}

我希望他们的父类Father能够在各自的对象上调用静态方法。

class Father {
    public function foo() {
        $className = $this->_modelName;
        return $className::bar();
    }
}

编辑:基本上,我希望能够调用foo()方法,并从相应的模型类调用bar()方法,避免使用额外的变量({{ 1}})?我试了$className没有成功。

2 个答案:

答案 0 :(得分:2)

我认为从模型名称作为字符串很难实现,但也许你可以考虑的事情有点不同?

从php 5开始,我们可以将对象分配给变量without moving the entire object around

这意味着当您将modelName分配到SonDaughter课程时,您可以轻松指定它...

......全班!

想象一下:

class Father {
  private $model;
  public function __construct($model) {
    $this->model = $model;
  }
  public function foo() {
    return $this->model->bar();
  }
}
class Son extends Father {
}
class Daughter extends Father {
}

这假定您使用此模型对象构造SonDaughter类。该函数不是静态的,因为我们需要一个构造函数来将模型分配给一个属性。

但您也可以考虑将模型传递给`foo()`函数:

public function foo($model) {
  return $model->bar();
}

关于dependency injection原则,允许您非常轻松地实现foo()函数,并且取决于继承等有些复杂的设计问题,这要好得多。

释放你从这个函数的依赖,因为你可以将任何$model对象传递给foo方法。

答案 1 :(得分:0)

或者你可以这样做:

<?php

    class Son extends Father {
        protected $_modelName = 'House';
    }

    class Daughter extends Father {
       protected $_modelName = 'Museum';
    }

    class Father {
        protected $_modelName = 'Father';
        public function getModelName() {
            return $this->_modelName;
        }
    }

    $father =  new Father();
    $son = new Son;
    $daughter = new Daughter();

     echo $father->getModelName();
     echo $son->getModelName();
     echo $daughter->getModelName();
?>