在类的所有函数中是否存在变量?

时间:2009-08-13 19:49:18

标签: php

我有一个小问题 - 我想减少我网站中的代码重复,而我能看到的最好方法是删除大量不必要的变量设置实例。

最常见的一个是$ baseUrl变量,它包含http主机和php自身值,以方便使用。但是,我必须为每个函数设置它:

class Site
{
function outputPage()
{    
$baseUrl = "http://". $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
}
}

这通常包含在网站使用的任何链接中:

echo '<a href="' . $baseUrl .'/article/jun/example11/">Example 11</a>';

它在整个课程中设置了六次,每个需要它的功能一次 - 有没有办法将它设置为一次然后允许所有功能访问它?

5 个答案:

答案 0 :(得分:5)

类的方法可以访问该类的成员。

class Site {

  private $baseurl;

  public function __construct()
  {
    $this->baseurl = "http://www.somesite.com";
  }

  public function hello()
  {
    print "My baseurl is " . $this->baseurl;
  }

}

$site = new Site;
$site->hello(); // My baseurl is http://www.somesite.com

答案 1 :(得分:4)

您可以将其设置为类变量,并在构造函数中初始化它:

class Site {
    public function __construct() {
        $this->baseUrl = "http://". $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
        var_dump('constructor : ' . $this->baseUrl);
    }
    function outputPage() {    
        // use $this->baseUrl
        var_dump($this->baseUrl);
    }
    protected $baseUrl;
}

然后,在使用课程时:

$a = new Site();
$a->outputPage();

你会得到:

string 'constructor : http://tests/temp' (length=31)
string 'http://tests/temp' (length=17)


在某些情况下,您还可以在声明它时“在运行中”初始化(在我的示例中,在受保护的行上)。
但这对一切都不起作用;你不能在那里调用一个函数,例如,如果我没记错的话;你不能连接字符串:

class Site {
    function outputPage() {    
        // use $this->baseUrl
        var_dump($this->baseUrl);
    }
    protected $baseUrl = "http://". $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
}

会给你这个错误:

Parse error: syntax error, unexpected '.', expecting ',' or ';'

但是这个:

class Site {
    function outputPage() {    
        // use $this->baseUrl
        var_dump($this->baseUrl);
    }
    protected $baseUrl = "http://www.google.com";
}

会起作用 - 但它不是那么强大,你不能真正做任何你想做的事,这样......

答案 2 :(得分:1)

只需使用该变量创建一个类成员:)

class Site {
  private $baseurl;
  public function __construct() {
    $this->baseurl = "http://". $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
  }
  public function outputPage() {    
    echo $this->baseurl;
  }
}

答案 3 :(得分:0)

我认为你应该使用常量:

define("BASE_URL", "http://".$_SERVER['HTTP_HOST'].rtrim(dirname($_SERVER['PHP_SELF']), '/\\'));

然后使用

echo '<a href="' . BASE_URL .'/article/jun/example11/">Example 11</a>';

使用常量是合适的,因为值在脚本的运行时间中永远不会改变。您也可以为它设置一个类变量。每个班级仍然必须重复。

class myClass{
    private $baseURL;
    function __construct()
    {
        $this->baseURL = http://".$_SERVER['HTTP_HOST'].rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
    }
    function speak()
    {
        echo $this->baseURL;
    }
}

答案 4 :(得分:0)

我更喜欢将这些事物定义为类常量。

class Settings
{
    const BASE_URL = "http://google.com";
}

然后,您可以在任何地方使用require_once("settings.php");并访问Settings::Base_URL