【问题标题】:What is the best way to auto generate getters and setters for a class in php? [closed]为 php 中的类自动生成 getter 和 setter 的最佳方法是什么? [关闭]
【发布时间】:2009-09-25 09:46:10
【问题描述】:

我经常创建一个包含一些私有变量的类。 当设置这个类的一个实例时,应该可以用 getter 和 setter 填充类的所有变量。

有没有一种简单的方法可以做到这一点,而不必在创建类时为每个变量键入所有这些 setter 和 getter?

现在我必须为类中的每个变量输入这个

public function setVar($var){
$this->var = $var;
}

public function getVar(){
return $this->var;
}

我们现在使用 RegExp,但我不知道这是否是最简单的方法... 我们使用 Eclipse 作为环境,也许有一些有用的插件?

【问题讨论】:

  • 虽然很痛苦,但实现这些几乎不需要太多时间。我通常在吃午饭的时候做。更好的是,将代码传递给学生以添加。
  • @Chris 将其传递给其他人不能被视为一个好的解决方案。学生或加载项可能也希望为此提供适当的解决方案...

标签: php eclipse class get set


【解决方案1】:

使用 Eclipse 转到 Preferences -> PHP -> Editor -> Templates -> New 并使用如下内容:

/**
 * Method to get the ${PropertyName}
 *
 * @return  ${ReturnType}  return the ${PropertyName}.
 *
 * @since   __DEPLOY_VERSION__
*/
public function get${MethodName}() {
  return $$this->${PropertyName};
}

/**
 * Method to set the ${PropertyName}
 *
 * @return  boolean  True on success and false on failed case
 *
 * @since   __DEPLOY_VERSION__
*/
public function set${MethodName}($$value) {
  $$this->${PropertyName} = $$value;
}

要使用模板,请输入其名称并按 ctrl+空格 - 当您输入名称时,上下文菜单也会自动出现。

【讨论】:

  • 任何与这些属性中的驼峰式使用相关的修复?
  • @porfiriopartida 我想知道同样的事情,最终在 get 和 set 中使用了不同的变量。使用模板时,只需要设置属性和getter函数即可。 ;-)
  • 对于 Netbeans 用户,首选项 -> 编辑器 -> 代码模板选项卡,语言:PHP,添加新
【解决方案2】:

你看过 __set 和 __get 方法吗?不知道这是否是您的意思,但是每当类成员被 SET 或 Retrieved/Fetched/Accessed 时都会自动调用。

【讨论】:

    【解决方案3】:

    Zend Studio 具有自动生成 getter/setter 的功能。

    【讨论】:

      【解决方案4】:

      我认为最好的方法是使用 __set 和 __get 与一些字符串函数,这里让我告诉你。

      class UserProfile
      {
          public function __get($key)
          {
              if(isset($this->$key))
              {
                  return $this->$key;
              }
          }
      
          public function __set($key,$val)
          {
              $this->cahnge($key,$val);
          }
      
          public function __call($key,$params)
          {
              if(substr("set",$key))
              {
                  //Update
              }elseif(substr("get",$key))
              {
                  //return
              }
      
              //Else Blah
          }
      
          private function change($key,$val)
          {
              if(isset($this->$key))
              {
                  $this->$key = $val;
              }
          }
      }
      

      __call() 方法将允许您使用诸如

      之类的函数进行设置

      $profile->setUsername('Robert Pitt'); 只要你 substr 设置/获取并检查字符串的其余部分作为类的值 :)

      另一个例子

      public function __call($method,$params = array())
      {
      
          if(isset($params[0]) && is_string($params[0]))
          {
              $this->$method = $params[0];
          }
      }
      
      //....
      
      $profile->username('Robert Pitt');
      

      这里还有很多工作要做

      【讨论】:

      • 你确定这行得通吗?我无法管理它。这是某种 PHP 魔法吗?我可以打电话给$profile-> __get(username),但我想打电话给$profile-> getUsername()
      • 尝试用$this->change($key,$val);替换$this->cahnge($key,$val);
      【解决方案5】:

      也许更好的解决方案:

      class base {
      
          protected $_vars = array();
      
      
          public function setVar($name, $value = null) {
              $this->_vars[$name] = $value;
          }
      
          public function getVar($name) {
              return isset($this->_vars[$name]) ? $this->_vars[$name] : null;
          }
      }
      

      然后简单地扩展这个类。或者你也可以使用 __set 和 __get 方法,但是它们的速度很慢。

      【讨论】:

      • 这可能是一个很好的解决方案,但是将所有内容放在一个数组中而不是全部作为不同的变量是一个好主意吗?还是没关系?
      • 如果是工作数据(如数组、字符串等),没关系。但是如果你想设置一些对象,比如数据库对象或其他对象,你不应该这样做。然后使用构造函数或其他方式。
      • 你确定 __set 和 __get 方法很慢吗??
      • @andho 是的,我很确定。抱歉,我找不到关于 PHP 如何在使用魔术方法时与内存一起工作的文章(我之前读过一段时间),但是如果您搜索,几乎每个“PHP 性能提示”列表上都写着魔术方法会减慢您的代码速度。
      猜你喜欢
      • 2022-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多