2009-09-14 63 views
3

main.php,自动加载,并将一个新的对象被创建:__autoload()为自动加载类的父类调用?

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在同一时间?

回答

8

否(不在确切同一时间),但是(它会得到加载,一切都会工作)。

当你打电话给new Triangle它会看到三角形是一个尚未加载的类,所以它叫__autoload()。然后这将是require_once Triangle.php文件。

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

简而言之,除了你所拥有的东西外,没有什么比你需要做的更多的事情了,但它通过了很多遍。

+0

+1但是省略了括号(这是评论) ,你的第一句话是“不,但是”:) :) – soulmerge 2009-09-14 08:01:49

+0

hehe yeah - 'twas on purpose。 “不”是在回答确切的问题,“是”回答了我的意思。 – nickf 2009-09-14 08:30:28

2

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

echo "loaded $class!\n"; 

声明到您的__autoload处理程序?

1

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

在你的情况下,它会先被调用三角,然后解析器遇到参考Triangle.php塑造和意志然后自动加载Shape.php

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

$t = new Triangle(); 

[~]> php test.php 
autoloading Triangle 
autoloading Shape