Почему вы не можете использовать операторы * в определении класса? - PullRequest
10 голосов
/ 05 мая 2011

Возможно, связанные:
Почему атрибуты 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 ]

5 голосов
/ 05 мая 2011

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

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

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

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

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

2 голосов
/ 05 мая 2011

Это потому, что в определении класса «настоящий» код вообще не разрешен, разрешены только определения свойств, методов и констант.Вы можете поместить свои операторы 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 просто поместите свой "статический" код после самого класса.protected static участников таким образом.

...