Вызывается ли __autoload () для родительских классов автоматически загружаемых классов? - PullRequest
3 голосов
/ 14 сентября 2009

В 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?

Ответы [ 3 ]

8 голосов
/ 14 сентября 2009

Нет (не в точно в то же время), но да (он будет загружен и все будет работать).

Когда вы вызываете new Triangle, он увидит, что Triangle - это класс, который еще не был загружен, поэтому он вызывает __autoload(). Затем будет require_once файл Triangle.php.

При разборе Triangle.php он видит, что есть еще один класс, который не был загружен (Shape), поэтому он повторяет процесс.

Короче говоря, вам ничего не нужно делать, кроме того, что у вас есть, но он делает это за несколько проходов.

2 голосов
/ 14 сентября 2009

Должно, да. Я полагаю, вы можете убедиться в этом, просто добавив

echo "loaded $class!\n";

утверждение для вашего обработчика __autoload?

1 голос
/ 14 сентября 2009

автозагрузка выполняется каждый раз, когда определение класса не может быть найдено.

В вашем случае он сначала будет вызываться для Triangle, затем парсер встречает ссылку на Shape в 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
...