Почему вы не можете использовать операторы * в определении класса?

Возможно связанные:
Почему атрибуты PHP не позволяют функции?

Прошу прощения, если об этом уже спрашивали, но почему вы не можете получить что-то вроде следующего:

class foo {

 require_once 'defines.php';

 private $_server = DB_SERVER;
 private $_username = DB_USERNAME;
 private $_password = DB_PASSWORD;
 private $_database = DB_NAME;
 public  $debug = false;
 public $_conn;

 function __construct() {                          
    $connection = @mysqli_connect($this->_server, $this->_username, $this->_password, $this->_database);
 }

 ...

}

Ура,

РЕДАКТИРОВАТЬ: Глядя, чтобы выяснить, почему это поведение существует и почему это невозможно. Как получилось, что голоса закрылись?

EDIT2: также хотел бы открыть это

2 ответа

Решение

Можно было require а также include файлы как внутри области функций, так и в глобальной области, прежде чем классы были добавлены в PHP.

Это всего лишь предположение - я не уверен, что еще мы могли бы сделать, кроме как для того, чтобы дизайнеры языка пришли и рассказали нам свою историю, - но я полагаю, что считалось, что от добавления этой функциональности в "новый" не получится никакой выгоды. Область действия "придумана путем добавления Классов, особенно учитывая сложность, добавленную к серверной части для ее поддержки.

Также не совсем ясно, какими будут правила определения области действия для любых заявлений, сделанных внутри requireд файл.

В заключение, я думаю, что вы задаете не тот вопрос. Вместо "почему это не поддерживается?" это скорее случай "почему это должно поддерживаться?".

Я надеюсь, что это поможет немного.

Это связано с тем, что в определении класса "настоящий" код вообще не разрешен, разрешены только определения свойств, методов и констант. Вы можете поместить свои операторы include в "main-scope" (процедурные), функции и методы, как и любой другой код.

class A {
  var $a = 1 + 1; // Parse error: unexpected '+'
}

Однако, насколько я знаю, это не поддерживается ни на одном языке. Например, Java использует статические блоки кода для этого

class A {
  private static int a = 0;
  static {
    a = 1+1;
  }
}

В PHP просто поместите свой "статический" код после самого класса.

class A {}
/* static */ {
  // do something
}

Его невозможно получить доступ private или же protectedstatic Члены этого пути.

Другие вопросы по тегам