问题描述
我是PHP的新手。要跳入其中,我有一个Person类,一个扩展Person的Customer类和一个扩展Customer的Basic类。我也有一个Book类(这是一个Bookstore项目),但这与问题无关。
在我的init.PHP文件中,我有关于Book和Customer的使用声明。根据我正在学习的这本垃圾书,从Customer(Basic)扩展过来的所有内容都应自动包含在Customer中。自动加载器功能可以很好地找到Book和Customer的新实例,因此我知道那里没有错。但是,如果我尝试创建Basic的新实例,它将找不到它。我很聪明,知道这是因为Basic.PHP位于其他Class文件的子文件夹中。所以我最好的猜测是我需要一个不同的自动装带器。但这很令人沮丧,因为您认为这本书会告诉我,但我已按照指示100%取得了T。
> mkdir -p path/to/directory
touch path/to/directory/S0Test_26060_0ns_CBT_0ns_DEBT.root
touch path/to/directory/S0Run_26061_500ns.root
touch path/to/directory/S0Test_26063_500ns_CW.root
touch path/to/directory/S0Test_26065_500ns.root
touch path/to/directory/S0Test_30000_500ns.root
> bash test.sh 26060 26065
./produce_file 26062
./produce_file 26064
忽略其他功能,因此,我仅上了一半课程,但是从您看到的内容来看,新书和新客户都正确传递了所需的$ filename。但是对于Basic,编译器表示找不到/../../asic.PHP,这告诉我“ Basic”是传递给$ classname的唯一内容。同样,根据这本愚蠢的书,应该通过客户找到Basic,因为Basic扩展了Customer。
Customer.PHP:
<?PHP
use Bookstore\Domain\Book;
use Bookstore\Domain\Customer;
function autoloader($classname) {
$lastSlash = strpos($classname,'\\') + 1;
$classname = substr($classname,$lastSlash);
$directory = str_replace('\\','/',$classname);
$filename = __DIR__ . '/src/' . $directory . '.PHP';
require_once($filename);
}
spl_autoload_register('autoloader');
function checkIfValid(Customer $customer,array $books): bool {
return $customer->getAmountToBorrow() >= count($books);
}
$book1 = new Book(9785267006323,"1984","George Orwell",12);
$book2 = new Book(9780061120084,"To Kill A Mockingbird","Harper Lee",2);
$customer1 = new Basic(5,"John","Doe","johndoe@email.com");
var_dump(checkIfValid($customer1,[$book1]));
$customer2 = new Customer(7,"Mary","Poppins","mp@email.com");
var_dump(checkIfValid($customer2,[$book1]));
?>
Basic.PHP:
namespace Bookstore\Domain;
class Customer extends Person {
我知道答案可能很明显,如果这个时间太长,或者有人大喊大叫,我深表歉意,但是根据这本书,这应该是按原样工作的。
解决方法
同样,根据这本愚蠢的书,由于Basic扩展了Customer,所以应该通过Customer找到Basic
Basic类尚未加载,因此无法知道它是什么。
您需要告诉PHP Basic类的全名
use Bookstore\Domain\Customer\Basic;
$customer1 = new Basic(5,"John","Doe","johndoe@email.com");
或者只是
$customer1 = new Bookstore\Domain\Customer\Basic(5,"johndoe@email.com");
我在发布之前尝试过。当我这样做时,它将在Customer文件夹中查找Customer.php。
因为您是根据自动加载功能中的类名称查找文件的。类的全名是Namespace + \ + Classname
,在这种情况下为Bookstore\Domain\Customer\Basic
,则文件名是{root}/Domain/Customer/Basic
。