Пространства имен PHP - подняться на уровень? - PullRequest
20 голосов
/ 30 августа 2011

Example1:

пространство имен Inori \ Test;

class MainTest {}

Example2:

пространство имен Inori \ Test \ SubTest;

класс SubTest расширяется ????{}

Вопрос: Есть ли способ быстро подняться на уровень в пространстве имен, чтобы SubTest мог расширить MainTest?что-то вроде "../MainTest"?Или я застрял с \Inori\Test\MainTest?

Ответы [ 2 ]

20 голосов
/ 30 августа 2011

Относительные пространства имен не поддерживаются.Тем не менее, есть запрос: https://bugs.php.net/bug.php?id=52504

Если вы импортируете свои классы вверху файла, это не должно быть большим делом.

namespace Inori\Test\SubTest;
use Inori\Test\MainTest;

class SubTest extends MainTest { }
1 голос
/ 13 февраля 2013

Смотрите, что принятый ответ уже предоставлен. Тем не менее, таким образом, код, который вы можете использовать, чтобы воспользоваться преимуществами относительных пространств имен (примечание: не стесняйтесь использовать приведенный ниже код бесплатно и ссылка на автора в вашем коде не требуется, автор не предоставляет никаких гарантий, и использование кода на свой страх и риск ).

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

В вашем классе просто добавьте следующий код:

public function TestRelativeNamespace()
{
    // (e.g., param1 = site\lib\firm\package\foo, param2 = .\..\..\different)
    $namespace = $this->GetFullNamespace(__NAMESPACE__, '.\\..\\..\\different');

    // will print namespace: site\lib\firm\different
    print $namespace;

    // to create object
    $className = $namespace . '\\TestClass';
    $test = new $className();
}

public function GetFullNamespace($currentNamespace, $relativeNamespace)
{
    // correct relative namespace
    $relativeNamespace = preg_replace('#/#Di', '\\', $relativeNamespace);

    // create namespace parts
    $namespaceParts = explode('\\', $currentNamespace);

    // create parts for relative namespace
    $relativeParts = explode('\\', $relativeNamespace);

    $part;
    for($i=0; $i<count($relativeParts); $i++) {
        $part = $relativeParts[$i];

        // check if just a dot
        if($part == '.') {

            // just a dot - do nothing
            continue;
        }
        // check if two dots
        elseif($part == '..') {

            // two dots - remove namespace part at end of the list
            if(count($namespaceParts) > 0) {

                // remove part at end of list
                unset($namespaceParts[count($namespaceParts)-1]);

                // update array-indexes
                $namespaceParts = array_values($namespaceParts);
            }
        }
        else {

            // add namespace part
            $namespaceParts[] = $part;
        }
    }

    if(count($namespaceParts) > 0) {
        return implode('\\', $namespaceParts);
    }
    else {
        return '';
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...