一个奇怪的问题php OOP

时间:2011-05-28 02:34:36

标签: php oop

嘿伙计们。我正在为一些数据设计一个模型,并希望它像:$this->groupmodel->VARIABLE->FUNCTION(VAR1, VAR2);一样调用一个函数,其中VARIABLE可以改变为任何东西,并传递给函数。

这感觉更正确(然后说$this->groupmodel->FUNCTION(VARIABLE, VAR1, VAR2)),因为每个VARIABLE具有完全相同的功能,并且功能正在({技术上]在VARIABLE上执行。这可能吗?
注意VARIABLE可以设置在任何地方(在它自己的函数中或在被调用的函数中)(它在整个类中都是持久的,但需要在每次调用时设置)。

最高

3 个答案:

答案 0 :(得分:2)

您应该创建一个实现您要使用的函数的类,并且您的所有“变量”应该是该类的对象。例如:

class Kid {
    private $age = 0;
    public function _construct($age){
      $this->age = $age;
    }
    public function birthday() { // implement in Kid instead of in Groupmodel
      $this->age++;
      echo "Growing old... ";
    }
    public function age($age_new = null){  // age setter and getter
      if(!is_null($age_new)){
        $this->age = $age_new;
      }
      return $this->age;
    }
}

然后在你的groupmodel中:

class GroupModel {

  private $variables;

  public function _set($name, $value) {
    if (array_key_exists($name, $this->variables)) {
      $this->variables[$name]->age($value);
    } else {
      $this->variables[$name] = new Kid($value);
    }
  }

  public function _get($name) {
    if (array_key_exists($name, $this->variables)) {
      return $this->variables[$name];
    } else {
      return null;
    }
  }
}

所以你可以打电话:

$this->groupmodel = new GroupModel()
$this->groupmodel->var1 = 8
$this->groupmodel->var1->birthday();  // will add 1 to var1's age and print "Growing old"
$this->groupmodel->var1 = 9  // will replace var1's age

我们在这里做的是每次尝试设置GroupModel对象的属性时自动创建类Kid的对象。 (这就是魔术方法_set()的作用)

实际上,它将它们创建为私有数组的元素,而不是GroupModel的真实属性。

然后,当尝试访问这些“属性”时,将调用_get()并检索数组的元素并将其返回。

因为它将是Kid类的一个对象,你可以调用它实现的每个方法(比如birthday())。

有关重载和魔术方法(如_get和_set)的详细信息,请参阅:

http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.members

答案 1 :(得分:1)

PHP 5.3允许你使用名为late static bindings

的非常好的东西

假设您有两个类:Foo,它扩展了groupmodel:

class groupmodel { 
      const MY_CONST = 'groupmodel'; 

      protected function myName(){
         echo static::MY_CONST; //Will print 'groupmodel'; 
      }


      protected function whoAmI(){ 
        //do something here
      }
}

和Foo:

class Foo extends groupmodel { 
      const MY_CONST = 'ClassFoo'; 

      public function tellMyName(){ 
        $this->myName(); //Will print 'ClassFoo';
      }
} 

实际上,这个想法不是使用

$this->groupmodel->FUNCTION(VARIABLE, VAR1, VAR2)
OR 
$this->groupmodel->VARIABLE->FUNCTION(VAR1, VAR2);

你将使用:

$object = new Foo(); 
$object->tellMyName(); //Will print 'ClassFoo'

现在$ object将授予所有 groupmodel 方法。

您的案例的另一个重要事项是尽可能多地使用OOP设置abstract class

答案 2 :(得分:1)

是的,这是可能的。 php允许您使用变量进行成员和函数访问。例如:$this->groupmodel->$myvar->myfunc($var1, $var2);

这将调用$this->groupmodel->{Whatever-string-is-stored-in-myvar}

请注意,如果要执行此操作,必须在类中设置groupmodel,并且$ myvar必须是groupmodel中的公共成员,并且$ myvar的内容必须是也是类的有效成员实现myfunc()。这是很多耦合依赖(因此zerkms贬低这种方法)。但是,有助于了解你正在尝试做什么。