PHP名称空间-提升一个级别?

PHP名称空间-提升一个级别?,php,namespaces,Php,Namespaces,示例1: 名称空间Inori\Test 类主测试 { } 示例2: 名称空间Inori\Test\SubTest 类子测试扩展???? { } 问题:是否有一种方法可以快速提升名称空间中的级别,以便子测试可以扩展MainTest?类似于“./MainTest”?或者我一直使用\Inori\Test\MainTest?不支持相对名称空间。但有人要求: 如果您在文件的顶部导入类,那应该没什么大不了的 namespace Inori\Test\SubTest; use Inori\Test\Ma

示例1:

名称空间Inori\Test

类主测试 { }

示例2:

名称空间Inori\Test\SubTest

类子测试扩展???? { }


问题:是否有一种方法可以快速提升名称空间中的级别,以便子测试可以扩展MainTest?类似于
“./MainTest”
?或者我一直使用
\Inori\Test\MainTest

不支持相对名称空间。但有人要求:

如果您在文件的顶部导入类,那应该没什么大不了的

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

class SubTest extends MainTest { }

请确保已提供接受的答案。但是,在此,您可以使用一个代码来利用相对的名称空间(注意:免费使用下面的代码,不需要在代码中引用作者,作者不提供任何保证,使用代码的风险自负)

更新:可以在类内部使用代码通过相对名称空间动态快速地加载其他类。本主题的发起者正在寻找一种通过相对名称空间将类扩展到其他类的方法,这在本代码中也是不可能的

在您的类中,只需添加以下代码:

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 '';
    }

}
公共函数TestRelativeNamespace()
{
//(例如,param1=site\lib\firm\package\foo,param2=.\..\different)
$namespace=$this->GetFullNamespace(\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;
//将打印命名空间:site\lib\firm\different
打印$namespace;
//创建对象的步骤
$className=$namespace'\\TestClass';
$test=新的$className();
}
公共函数GetFullNamespace($currentNamespace,$relativeNamespace)
{
//正确的相对命名空间
$relativeNamespace=preg\u replace(“\\/”Di“,“\\”,$relativeNamespace);
//创建命名空间部件
$namespaceParts=explode(“\\”,$currentNamespace);
//为相对命名空间创建部件
$relativeParts=explode(“\\”,$relativeNamespace);
$part;
对于($i=0;$i 0){
//删除列表末尾的零件
未设置($namespaceParts[count($namespaceParts)-1]);
//更新数组索引
$namespaceParts=数组_值($namespaceParts);
}
}
否则{
//添加命名空间部分
$namespaceParts[]=$part;
}
}
如果(计数($namespaceParts)>0){
返回内爆(“\\”,$namespaceParts);
}
否则{
返回“”;
}
}

PHP中的名称空间不能嵌套:没有层次结构。每个名称空间都是独立声明的,名称空间之间没有父子关系
Foo\Bar
Foo\Bar\Baz
是一个完全不同的名称空间。因此,我遇到了这个问题,并意识到我并不完全需要父名称空间,我可以从全局名称空间中做我需要的事情,但不知道如何实现。事实证明,您只需要用反斜杠启动名称空间,它就不会使用嵌套名称空间。因此,如果您在
Foo\Bar
命名空间中并调用
new Baz\Bat()
它将位于
Foo\Bar\Baz\Bat()
命名空间中。但是,如果您调用
new\Baz\Bat()
它将位于
Baz\Bat()
命名空间中。使用
use
被称为别名/导入,它可以用5种方式使用:这确实无助于解决关于在
类子扩展中用什么来代替问号的原始问题????{…}
其中子项从上一级命名空间继承。