类中的PHP If语句来设置受保护的变量


PHP If Statement in Class to set protected variable

我试图在PHP中设置一个依赖于if语句的类Variable,该语句可用于该类中的所有函数。只要设置变量就可以了,但只要我尝试从IF语句进行设置,一切都会崩溃。

示例:

工作

class Default_Service_NewSugar {
 protected $base_url = "http://url1";
 function test() {
   return $this->base_url;
 }
}

不工作

class Default_Service_NewSugar {
if($_SERVER['APPLICATION_ENV']=="development"){
  protected $base_url = "http://url1";
 } else {
  protected $base_url = "https://url2";
   }
function test() {
  return $this->base_url;
  }
}

这在课堂上是不可能的吗?如果没有,我还有别的办法吗?

主要问题是将过程代码放入类中。参考PHP.net文档:

一个类可能包含自己的常量、变量(称为"属性")和函数(也称为"方法")。php.net

我建议阅读关于如何使用OOP的PHP手册,并阅读网上提供的许多OOP教程。

正如在其他答案中提到的,您应该在类构造函数中进行初始化工作。

class Default_Service_NewSugar 
{
    protected $base_url;
    public function __construct()
    {
        $this->base_url = ($_SERVER['APPLICATION_ENV'] == "development")
            ? "http://url1"
            : "https://url2";
    }
    function test() 
    {
        return $this->base_url;
    }
}

更像OOP的方法是在配置文件中设置URL,并在启动类时将变量传递给类。

class Default_Service_NewSugar 
{
    protected $base_url;
    public function __construct($base_url)
    {
        $this->base_url = $base_url;
    }
    function test() 
    {
        return $this->base_url;
    }
}
//usage would then be:
$default_service = new Default_Service_NewSugar($url_from_configuration_file);
$default_service->test(); //outputs the given URL

您应该在构造函数中编写该条件语句。而且,不需要每次初始化变量时都指定访问说明符,您可以指定一次,在初始化部分只分配值。同时优化您的代码。

class Default_Service_NewSugar {
    protected $base_url = "http://url";
    function __construct() { 
        $this->base_url .= $_SERVER['APPLICATION_ENV']=="development" ? 1 : 2;
    }
    function test() {
       return $this->base_url;
    }

}

您有很多拼写错误,这不是处理类中变量的完美方法

class Default_Service_NewSugar {
    protected $base_url;
    public function __construct() {
        $this->base_url = ($_SERVER['APPLICATION_ENV'] == "development") ? "http://url1" : "http://url2";
    }
    public function test() {
        return $this->base_url;
    }
}

如前所述,您可以在构造函数内启动变量。实现目标的另一种方法是使用属性访问功能,而不是直接访问对象字段。通过这种方式,您可以很容易地添加附加条件,代码将如下所示:

class Default_Service_NewSugar {
    public function __construct() {
    }
    public function getBaseURL($env = null) {
        $env = $env ? $_SERVER['APPLICATION_ENV'] : $env;
        return ($env == "development") ? "http://url1" : "http://url2";
    }
}
$obj = new Default_Service_NewSugar();
print $obj->getBaseURL();