1

给定如下基本对象,我的倾向(基于使用 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 ];
}
4

3 回答 3

2

不要发明聪明的变通方法,让开发人员在您难以理解之后维护代码。PHP 这样做的方式是使用 $this,您应该接受语言的约定。

于 2013-03-14T18:52:44.400 回答
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;
   }

但这可能被称为精益的反面。但这也说明了这一点(和 Alex 的),即 php 没有考虑到你的责任原则,你最终会做更多的工作来让下一个人更难实现基于原则的目标,但会对其他人来说似乎是审美的。

另一方面,php 确实有神奇的方法 __get()__set()通过定义它们的处理方式来允许引用未定义或不可访问的属性。有了它,你就不需要参考$this->friend了,因为它不存在。只需引用该方法的论点(这很方便,但又会让事情变得很麻烦)。

于 2013-03-14T19:14:57.970 回答
0

我很同情你的问题,因为我几乎是自己发布的。在这种情况下,您想要做的事情对您来说更具可读性,但对于另一个期望在针对类级别对象时标准使用 $this-> 的 PHP 开发人员来说,这不会是。

于 2013-03-14T19:00:11.140 回答