У меня небольшая проблема: я хочу уменьшить дублирование кода на моем сайте, и лучший способ, который я могу видеть, – удалить много ненужных экземпляров переменной.
Одним из наиболее распространенных является переменная $ baseUrl, которая содержит значения хоста и 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>';
Он устанавливается примерно шесть раз по всему классу, один раз для каждой функции, которая ему нужна – есть ли способ установить его один раз, а затем разрешить всем функциям доступ к нему?
Вы можете установить его как переменную класса и инициализировать его в конструкторе:
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"; }
Будет работать – но это не так сильно, и вы не можете делать все, что захотите, таким образом …
Методы класса могут обращаться к членам этого класса.
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
просто создайте члена класса с этой переменной 🙂
class Site { private $baseurl; public function __construct() { $this->baseurl = "http://". $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); } public function outputPage() { echo $this->baseurl; } }
Я предпочитаю определять такие вещи как классовые константы.
class Settings { const BASE_URL = "http://google.com"; }
Затем вы можете использовать require_once("settings.php");
в любом месте и иметь доступ к Settings::Base_URL
Я думаю, вы должны использовать для этого константу:
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; } }