В 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
одновременно?
Нет (не в то же время), но да (он загрузится и все будет работать).
Когда вы вызовете new Triangle
он увидит, что Треугольник – это класс, который еще не загружен, поэтому он вызывает __autoload()
. Затем это потребует файл require_once
.
При разборе Triangle.php он видит, что есть еще один класс, который не был загружен (Shape), чтобы он повторил процесс.
Короче говоря, вам больше нечего делать, чем то, что у вас есть, но он делает это в нескольких проходах.
Да, должно быть. Я думаю, вы могли бы убедиться, что просто добавив
echo "loaded $class!\n";
для вашего обработчика __autoload?
autoload выполняется каждый раз, когда определение класса не может быть найдено.
В вашем случае он будет сначала вызван для треугольника, тогда синтаксический анализатор встретит ссылку на 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