Подтвердить что ты не робот

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

Возможно Связано:
Почему атрибуты 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: также хотел бы снова открыть этот

4b9b3361

Ответ 1

Файлы require и include были доступны как в пределах области действия, так и в глобальной области, до того, как Классы были добавлены в PHP.

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

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

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

Я надеюсь, что это поможет небольшим образом.

Ответ 2

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

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 или protected static.