gpt4 book ai didi

PHP 自动加载命名空间

转载 作者:行者123 更新时间:2023-12-04 16:51:03 24 4
gpt4 key购买 nike

我想自动加载我的类,只放置命名空间 + 文件名。

示例:

目录骨架:

\var\www
|_ foo
| |_ A.php
| |_ B.php
|
|_ index.php

A.php:
<?php

namespace foo\A;

class A {

private $a;

public function __construct($a) {
$this->a = $a;
}

}

B.php:
<?php

namespace foo\B;

use foo\A;

class B extends A {

private $b;

public function __construct($a, $b) {
parent::__construct($a);
$this->b = $b;
}

}

index.php:
<?php

use foo\B;

define('ROOT', __DIR__ . DIRECTORY_SEPARATOR);

$b = new B('s', 2);

function __autoload($classname) {
$namespace = substr($classname, 0, strrpos($classname, '\\'));
$namespace = str_replace('\\', DIRECTORY_SEPARATOR, $classname);
$classPath = ROOT . str_replace('\\', '/', $namespace) . '.php';

if(is_readable($classPath)) {
require_once $classPath;
}
}

问题是在类 A 和 B 中,我用类名声明了命名空间,当我使用它时,我打印了 __autoload 的变量并且是正确的,但是在调用构造函数时却找不到类。

错误:
Fatal error: Class 'foo\A' not found in /var/www/foo/B.php on line 7

如果我只实例化A,而不使用B,问题是一样的。

我需要这样做,因为我希望在B类中,如果不放use语句,就不能使用A,要做到更严格。

如果您理解我的解释,我现在不知道,但无论如何感谢您的任何建议!!

PD:对不起,我的英语水平。

最佳答案

您的代码应该是类中的代码:

A.php

<?php

namespace foo;

class A {

private $a;

public function __construct($a) {
$this->a = $a;
}

}

B.php
<?php

namespace foo;

class B extends A {

private $b;

public function __construct($a, $b) {
parent::__construct($a);
$this->b = $b;
}

}

关于PHP 自动加载命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19942462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com