0

通常,当我编写 PHP 类时,我会执行以下操作:

class MyClass () {
   public attribute1;
   public attribute2;
   public attribute3;
}

是否可以根据逻辑设置属性?

class MyClass () {

   public function __construct() {
      if (some condition) {
         public attribute1;
         attribute1 = 23;
      } else {
         public attribute1;
         attribute1 = 55;
         public attribute2;
         attribute2 = 11;        
      }
   }
}
4

6 回答 6

3

就像其他人说的那样,使用$this->param = 11;,但我不喜欢这个想法,因为我不喜欢我的类中未声明的变量。

在类定义中声明变量是为了可读性,您可以设置私有、公共和受保护。在java中这是不允许的,所以应该在php中,它应该是 error

如果您不知道要使用哪些变量,请使用魔术方法 _get ()_set()

示例代码:

class MyClass {

    private $store = [];

    public function __get($name)
    {
        return isset($this->store[$name]) ? $this->store[$name] : null; # or output error
    }

    public function __set($name, $value)
    {
        $this->store[$name] = $value;
    }

    public function __construct()
    {
        if (rand(0,1)) {
            $this->attribute1 = 12;
        } else {
            $this->attribute2 = 21;
        }
    }

}

var_dump( (new MyClass)->attribute1 );
var_dump( (new MyClass)->attribute1 );
var_dump( (new MyClass)->attribute1 );

输出:

int(12)
NULL
int(12)
于 2012-09-26T20:39:33.487 回答
2

是的,但你这样做:

class MyClass () { 

   public function __construct() { 
      if (some condition) { 
         $this->attribute1 = 23; 
      } else { 
         $this->attribute1 = 55; 
         $this->attribute2 = 11;         
      } 
   } 
} 

并且属性将始终是公开的。

于 2012-09-26T20:40:01.313 回答
2

首次访问时会创建一个属性。正如其他人所说,这不是一种好的做法,它被称为猴子补丁,并且只能在动态语言中实现(即那些不涉及编译器的语言,至少在开发人员方面)。

这不是一个好的做法,因为如果您不将字段集中在一个地方,自动生成工具将无法工作,代码助手可能无法工作,并且代码库的其他贡献者可能无法理解您的代码。

然而,这并不总是一个坏习惯。例如,CakePHP(一个 MVC 框架)使用以下技术来加速某些类的编写。当你Controller像这样扩展类时

class ThingsController extends AppController {

  var $components = array("Foo", "Bar", "Baz");

  function index() {
    $this->Foo($this->Bar->bar());
  }

}

$components变量由基类构造函数检查以动态加载Foo,BarBaz类,并使它们在实例变量中自动可用,例如$this->Fooinside ThingsController。然而,这在文档中已明确说明,并且是现代框架中彻底使用的一种约定,用于提供魔术变量,即未在代码中直接声明的变量。这种用法可以节省打字时间,但代价是破坏了上述工具的支持 - 并不是说​​新开发人员经常会有些头疼:P

于 2012-09-26T20:55:32.497 回答
1

不存在的属性在第一次调用时创建。

class MyClass () {

   public function __construct() {
      if (some condition) {
         $this->attribute1 = 23;
      } else {
         $this->attribute1 = 55;
         $this->attribute2 = 11;        
      }
   }
}

但这样做并不是一个好习惯。这样,您将不得不在项目中的任何位置搜索属性声明。想想你的队友(如果有的话)或你未来的自己。您应该明确定义该类具有的所有属性,否则您肯定会忘记定义它们的位置。

于 2012-09-26T20:40:03.170 回答
0

是的,你不会public attribute1;'在方法中使用。你会使用$this->attribute1 = 23;$this->attribute2 = 11;

于 2012-09-26T20:39:46.947 回答
0

当然。

class MyClass () {
   public $attribute1;

   public function __construct($an_array = NULL) {
      if ($an_array) {
         $this->attribute1 = $an_array;  
      }
   }
}
于 2012-09-26T20:39:56.197 回答