如何在文件中包含php别名

k4aesqcs  于 2023-03-07  发布在  PHP
关注(0)|答案(2)|浏览(114)

我可以把这个写在一个文件里:

use Carbon\Carbon as Carbon;

我试着创建一个文件'aliases.php':

use Carbon\Carbon as Carbon;

然后我这样引用它:

require __DIR__.'/../bootstrap/aliases.php';

printf("Right now is %s", Carbon::now()->toDateTimeString());

但这给了我错误:"致命错误:未找到类"碳""
那么,我怎样才能"包含"一个具有所有预定义别名的文件呢?

sulc1iza

sulc1iza1#

首先,你的aliases. php文件不起作用的原因是因为use语句只在声明它们的文件中可见。换句话说,它们在你的aliases. php文件中起作用,但在include/requirealiases.php文件中不起作用。
来自PHP文档使用名称空间:别名/导入:

    • 注:**

导入规则以每个文件为基础,这意味着包含的文件将不会继承父文件的导入规则。
其次,由于PHP中命名空间的工作方式,不可能执行您要执行的操作。当PHP看到一个类名时,它总是尝试在当前命名空间中查找该类,并且无法更改。因此,如果您在任何命名空间代码中调用Carbon,它将被解释为Current\Namespace\Carbon,如果从全局名称空间调用,则解释为**\Carbon**。
我想到的唯一一个可以做类似事情的方法是在全局名称空间中声明一个类,它将扩展您试图使用的类,然后使用这些类来代替。

<?php
use Carbon\Carbon as BaseCarbon;

class Carbon extends BaseCarbon {}

然后在您的代码中,您可以通过以下方式访问它:

\Carbon::now();

请记住,您需要在类名前面加上****前缀,以便它总是取自全局名称空间,除非您正在执行的代码已经在全局名称空间中。

tp5buhyn

tp5buhyn2#

扩展不适用于final类。
class_alias是更好的选择。

function assert_true(bool $actual) {
    if ($actual !== true) {
        echo "ERROR: Expected true", PHP_EOL;
        echo (new \AssertionError("Expected true"))->getTraceAsString(), PHP_EOL;
        return;
    }
    
    echo "Validated\n";
}

function assert_false(bool $actual) {
    if ($actual !== false) {
        echo "ERROR: Expected true", PHP_EOL;
        echo (new \AssertionError("Expected false"))->getTraceAsString(), PHP_EOL;
        return;
    }
    
    echo "Validated\n";
}

function validate($a, $b) {
    // the objects are the same
    assert_true($a == $b);
    assert_false($a === $b, false);
    assert_true($a instanceof $b);
    
    // the classes are the same
    assert_true($a instanceof foo);
    assert_true($a instanceof bar);
    
    assert_true($b instanceof foo);
    assert_true($b instanceof bar);
}

class foo { }

class baz extends foo {
    
}

class_alias('foo', 'bar');


$a = new foo;
$b = new bar;
$c = new baz;

echo "Aliasing \n=========\n\n";
validate($a, $b);

echo PHP_EOL, PHP_EOL;

echo "Inheritance \n=========\n\n";
validate($a, $c);

相关问题