我试图在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();