2009-09-14 60 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