3

main.php中,添加了自动加载并创建了一个新对象:

function __autoload($class) {
    require_once($class . '.php');
}
...
$t = new Triangle($side1, $side2, $side3);

Triangle.php

class Triangle extends Shape {...}

Shape.php是一个抽象类:

abstract class Shape {
    abstract protected function get_area();
    abstract protected function get_perimeter();
}

我可以看到该__autoload函数调用Triangle.php,但它是否同时调用Shape.php

4

3 回答 3

8

不(不是在同一时间),但是是的(它会被加载并且一切都会工作)。

当你调用new Triangle它时,它会看到 Triangle 是一个尚未加载的类,所以它调用__autoload(). 这将require_once是 Triangle.php 文件。

在解析 Triangle.php 时,它看到还有另一个尚未加载的类(Shape),因此它重复了该过程。

简而言之,除了你已经拥有的东西之外,你不需要做更多的事情,但它会通过多次传递来完成。

于 2009-09-14T07:47:41.120 回答
2

它应该,是的。我想你可以通过简单地添加一个来验证

echo "loaded $class!\n";

对您的 __autoload 处理程序的声明?

于 2009-09-14T07:47:02.107 回答
1

每次找不到类定义时都会执行自动加载。

在您的情况下,它将首先为 Triangle 调用,然后解析器在 Triangle.php 中遇到对 Shape 的引用,然后将自动加载 Shape.php

<?php
function __autoload($class) {
    print "autoloading $class\n";
    require_once($class . '.php');
}

$t = new Triangle();

[~]> php test.php 
autoloading Triangle
autoloading Shape
于 2009-09-14T07:49:57.450 回答