不使用“$ this->”解析成员属性?

时间:2013-03-14 18:50:15

标签: php oop syntax

给定一个基本对象如下我的倾向(基于使用AS3)是$friend可以解释为$this->friend但PHP解析器只看到$friend作为未初始化的变量本地化到holler函数。有没有办法在不使用$this->的情况下访问成员变量?我的目标是发现最简洁的语法。

class MyBuddy
{
   private $friend = true;

   public function holler()
   {
       if ( $friend ) // <- parser won't resolve $friend to a member variable
          return 'Heeeeey Buuuuuday!';
       else
          return null;
   }
}

更新:在考虑给出的答案后,似乎最简洁易懂的方法是通过引用函数顶部的函数级变量来传递实例变量。对于引用详细实例变量的函数来说,它是一个不错的解决方案。

// Demonstrating a simple cache which abbreviates $this->thingCollection 
// to $things for the function body
public function getThing( $id, $qty )
{
   $things = &$this->thingCollection; // <-- pass by reference

   if ( empty($things) )
      $things = [];

   if ( empty($things[$id]) )
      $things[ $productId ] = [];

   if ( empty($things[ $id ][ $qty ]) )
      $things[ $id ][ $qty ] = get_thing_from_database( $id, $qty );

   return $things[ $id ][ $qty ];
}

3 个答案:

答案 0 :(得分:2)

在您很难理解之后,不要发明开发人员维护代码的巧妙解决方法。 PHP的方式是使用$ this,你应该接受语言的约定。

答案 1 :(得分:1)

问题是php不会将它们视为同一个,因此允许特定方法使用具有该属性名称的局部变量。例如:

class MyBuddy
{
   private $friend = true;

   public function holler($friend)
   {
       if ($this->friend == $friend ) // <- parser won't resolve $friend to a member variable
          return 'Heeeeey Buuuuuday!';
       else
          return null;
   }
}

define("HELL_NAW", false);
define("MMM_HMMM", true);

$hombre = new MyBuddy();
echo $hombre -> holler(HELL_NAW);

$l_jessie = new MyBuddy();
echo $l_jessie -> holler(MMM_HMMM);

为了得到你想要的东西,你可以选择:

 public function holler()
   {
       $friend = $this ->friend;
       if ($friend )
          return 'Heeeeey Buuuuuday!';
       else
          return null;
   }

但这可能被称为与精益相反。但它也说明了(并且亚历克斯的)PHP没有在你的责任原则中设置的点,你最终会做更多的工作,让下一个人更难以实现基于原则的目标,但是对任何人来说都是美学的。

另一方面,php确实有magic methods __get()__set(),它们允许通过定义处理方式来引用未定义或不可访问的属性。这样,您就不需要引用$this->friend,因为它不存在。只需引用该方法的参数(这很方便但会再次让集群讨论)。

答案 2 :(得分:0)

我很同情你的问题,因为我差点自己发布。在这种情况下,您想要做的事情对您来说更具可读性,但对于希望标准使用$ this-&gt;的其他PHP开发人员而言则不会这样。在定位类级别对象时。