Существует ли переменная во всех функциях класса?

У меня небольшая проблема: я хочу уменьшить дублирование кода на моем сайте, и лучший способ, который я могу видеть, – удалить много ненужных экземпляров переменной.

Одним из наиболее распространенных является переменная $ 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; } }