我有一个小问题 - 我想减少我网站中的代码重复,而我能看到的最好方法是删除大量不必要的变量设置实例。
最常见的一个是$ 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>';
它在整个课程中设置了六次,每个需要它的功能一次 - 有没有办法将它设置为一次然后允许所有功能访问它?
答案 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