PHP类,被认为是坏习惯?二传手和接球手

PHP类,被认为是坏习惯?二传手和接球手,php,class,oop,Php,Class,Oop,快速问题: 在构造函数中设置如下内容是否被视为不良做法: Class whatever { $var = ""; public function __construct($var){ $this->var = $var; } //And then return it in another function like public function getVar(){ return $this->var;

快速问题: 在构造函数中设置如下内容是否被视为不良做法:

Class whatever {

    $var = "";

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

    //And then return it in another function like
    public function getVar(){
        return $this->var;
    }
}

不,这是一个很好的做法

假设您有20个字段,并且必须填充它们才能正确使用类


好的做法是在构造中初始化它们。如果使用setter,则必须调用20个方法

是的,这是一种不好的做法,因为您没有声明
$var
,也没有使用setter方法。当您不声明变量,也不声明它是私有的或受保护的时,getter和setter方法的意义就完全消失了。然后您可以使用
$class->var=something

Class whatever {
 private $var;

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

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

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

你有很好的答案,但我会告诉你更多的信息

构造函数的作用是什么? 如果类实例需要初始化,请在类中使用构造函数

  • 构造函数中设置的变量的getter可以作为了解实例是如何初始化的一种方法
二传手 当您需要修改实例的行为时,或者当您想将数据加载到实例中时,您需要这些

吸气剂 检索实例内容的唯一方法(由于太多原因,不鼓励使用公共属性)

我的例子 你可以随意做你想做的事情,这只是一个例子,显然它什么都没做。如果你想问这个问题,请问

<?php
class AnExampleClass {
  // this is convenient sometimes but I don't recommend it
  public $public = '';
  protected $protected;
  private $private;
  public function __construct($private, $protected){
    $this->private = $private;
    $this->setProtected($protected);
  }
  public function getPrivate(){
    return $this->private;
  }
  public function getProtected() {
    return $this->protected;
  }
  public function setProtected($protected) {
    // only allow boolean
    $this->protected = (bool)$protected;
  }
  public function __get($name) {
    // read the manual on this magic
  }
  public function __set($name, $value) {
    // read the manual on this magic
  }
}

实际上,这是正确的方法。如果您要创建一个名为setVar的函数,这是一个好方法吗??没有构造部分?没有,一点也没有。这就是构造函数的作用。这并不是一个坏的做法,但我不认为传递给构造函数中类的东西(强制依赖项)通常不会通过getter再次取出。如果你在初始化的时候传递了一些东西(比如DB连接),那么它通常在内部使用/如果你有一个包含20个字段的类,你必须单独设置,那么你的设计很糟糕如果我看到一个包含20个参数的类,我会跑一英里。一个班级应该做一件事,把一件事做好。如果它需要20位数据才能运行,那么它很可能效率低下。我不是说你必须从用户那里获得所有这些字段的输入,你应该用一些初始值为它们设置值。@Martin Bean:20只是一个例子。在我看来,6是非常低效的。我确实设置了我的变量,只是没有添加到expample中