Вложенные классы PHP работают ... вроде? - PullRequest
8 голосов
/ 09 апреля 2010

Итак, если вы попытаетесь создать вложенный класс, подобный этому:

//nestedtest.php

class nestedTest{
    function test(){
         class E extends Exception{}
         throw new E;
    }
}

Вы получите ошибку Fatal error: Class declarations may not be nested in [...]

но если у вас есть класс в отдельном файле, например:

//nestedtest2.php

class nestedTest2{
    function test(){
         include('e.php');
         throw new E;
    }
}

//e.php
class E Extends Exception{}

Итак, почему второй хакерский способ это работает, а не хакерский способ это не работает?

Ответы [ 3 ]

18 голосов
/ 09 апреля 2010

Из руководства (http://php.net/manual/en/function.include.php):

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

1 голос
/ 09 апреля 2010

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

Кстати, причина, по которой он работает, заключается в том, что класс - это просто определение - с определением класса не связано выполнение. Таким образом, этот файл (e.php) анализируется, как только вы включаете его, и затем его класс становится доступным для текущего контекста выполнения. Только исполняемые части кода (т. Е. throw new E;) будут фактически принадлежать области действия вызывающей стороны.

1 голос
/ 09 апреля 2010

Второй способ - не вложенность классов. Вы просто имеете обе декларации в одном файле, который отличается от вашего первого примера. В PHP вы можете иметь несколько объявлений классов в одном файле, это организационное решение, а не требование.

...