PHP自动加载类/子类

问题描述

我是PHP的新手。要跳入其中,我有一个Person类,一个扩展Person的Customer类和一个扩展Customer的Basic类。我也有一个Book类(这是一个Bookstore项目),但这与问题无关。

在我的init.PHP文件中,我有关于Book和Customer的使用声明。根据我正在学习的这本垃圾书,从Customer(Basic)扩展过来的所有内容都应自动包含在Customer中。自动加载器功能可以很好地找到Book和Customer的新实例,因此我知道那里没有错。但是,如果我尝试创建Basic的新实例,它将找不到它。我很聪明,知道这是因为Basic.PHP位于其他Class文件的子文件夹中。所以我最好的猜测是我需要一个不同的自动装带器。但这很令人沮丧,因为您认为这本书会告诉我,但我已按照指示100%取得了T。

这是init.PHP文件内容

> 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...