动态PHP方法

时间:2016-04-14 13:33:11

标签: php oop zend-framework

我正在使用PHP中的自定义数据库表映射器。 是否有可能在PHP中使用“虚拟方法”来访问属性?和方法一样,那些并不存在。

例如:类“user”具有属性“$ name”,我不想为此创建“Get”方法,但我想通过虚拟方法访问该属性,如下所示: $用户>的GetName();

我在考虑与公约合作。因此,每次调用“虚拟”方法时,都会捕获它,并检查它是否具有前缀“Get”或“Set”。

如果它具有前缀“Get”,则在“Get”之后剥离部件并将其设为小写,因此您拥有要访问的属性。

我的想法(伪代码):

public function VirtualMethodCalled($method_name)
{
   //Get the First 3 Chars to check if Get or Set
   $check = substr($method_name, 0, 3);

   //Get Everything after the first 3 chars to get the propertyname
   $property_name = substr($method_name, 3, 0);

   if($check=="Get")
   {
       return $this->{$property_name};
   }
   else if($check=="Set")
   {
       $this->{$property_name};
       $this->Update();
   }
   else
   {
       //throw exc
   }
}

1 个答案:

答案 0 :(得分:3)

您可以使用魔术方法来实现此目的,例如:

class A {

    private $member;


    public function __call($name, $arguments) {
      //Get the First 3 Chars to check if Get or Set
      $check = substr($method_name, 0, 3);

     //Get Everything after the first 3 chars to get the propertyname
     $property_name = substr($method_name, 3);

     if($check=="Get")
     {
       return $this->{$property_name};
     }
     else if($check=="Set")
     {
       $this->{$property_name} = $arguments[0]; //I'm assuming
     }
     else
     {
         //throw method not found exception
     }
    }
}

我主要使用您为内容提供的代码。显然,您可以将其扩展为处理函数名称别名或任何您需要的内容。