X-core
@X-core
начинающий веб разработчик

Как загрузить классы с помощью __autoload?

Выполняю лабораторную работу №1.6 из уроков "Специалист" PHP уровень 3 урок 1.
Задание:
Упражнение 1: Создание классов в отдельных файлах

В текстовом редакторе откройте файл oop\users.php

В текстовом редакторе создайте новый файл

Перенесите описание абстрактного класса UserAbstractиз файла oop\users.phpв новый файл
•и т.п.
Упражнение 2: Использование автозагрузки файлов
Сохраните новый файл как oop\classes\UserAbstract.class.php
В файле oop\users.php(основной код) создайте и опишите функцию __autoload(), которая производит автозагрузку нужного класса при создании его экземпляра

Все классы лежат в папке: D:\OpenServer2\domains\lessonsPHP2016.local\less3\oop\classes
классы не находит как в файле users.php(файл с автозагрузкой классов), так и через папку classes, пишет, что не находит классы,которые реализуются , либо наследуются. До переноса кода в отдельные файлы и папку всё работало.
Предполагаю,что дело в правильном указании пути к подключению файлов, но пока что не смог найти правильное решение...
Код файла users.php:
<?php
function __autoload($name) {
echo "Ищем класс $name
";
if (file_exists($name)) {
include "$name.class.php";
}else{
echo 'Файла нет!';
}
}
$user = new SuperUser('Mike', 'Matrix', '123456', 'admin');
echo "Всего обычных пользователей:". $user::$countObjSupUser;
$user1 = new User('John', 'Link', '123' );
echo "Всего супер-пользователей:" . $user1::$countObjUser;
_____________________________________________________________________________
User.class.php:

<?php

class User extends UserAbstract {
public $name;
public $login;
public $password;
public static $countObjUser = 0;

//выводит информацию о пользователе в произвольной форме
function showInfo()
{
echo "Name: $this->name

Login: $this->login

Password: $this->password
";
}
function __construct($n, $l, $p) {
$this->name = $n;
$this->login = $l;
$this->password = $p;
echo self::$countObjUser++;
echo __CLASS__;
}

}
___________________________________________________________
UserAbstract.class.php:
<?php
abstract class UserAbstract {
abstract function showInfo();
}
____________________________________________________________________________________________________________
SuperUser.class.php:
<?php
class SuperUser extends User implements ISuperUser {
public $role;
public static $countObjSupUser = 0;

function __construct($n, $l, $p, $r) {
echo self::$countObjSupUser++;
echo __CLASS__;
parent::__construct($n, $l, $p);
$this->role = $r;
}

function showInfo()
{
parent::showInfo(); // TODO: Change the autogenerated stub
echo "Роль: {$this->role}\n";
}

//возвращает ассоциативный массив, в котором именами ячеек являются имена свойств объекта,
// а значениями ячеек - значения свойств объекта
function getInfo() {
$array = [];
foreach ($this as $key=>$value){
$array[$key] = $value;
}
return $array;
}

}
_____________________________________________________________
ISuperUser.class.php:
<?php
interface ISuperUser {
function getInfo();
}
______________________________________________________________________

Благодарю за столь важную для меня поддержку. Да прибудет с Вами сила:))
  • Вопрос задан
  • 246 просмотров
Решения вопроса 1
@novrm
Устарел __autoload

Функция __autoload была заменена на spl_autoload_register ещё в версии 5.1.
Основным преимуществом spl_autoload_register является возможность использовать несколько автозагрузчиков. В php 7.2 будет выбрасываться Deprecation notice на стадии компиляции.

/**
 * Включаем автозагрузку классов в PHP с использованием SPL.
 */
spl_autoload_extensions('.php');
spl_autoload_register();
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Artem0071
Безработный mr. Junior
У вас точно есть ошибка в этой строке:
if (file_exists($name)) {

у вас $name - только название класса (например: User, SuperUser ...)
а file_exists() - функция которая ищет файл
вам нужно что-то вроде этого:
if (file_exists('path/to/directory/'.$name.'.class.php')) {
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы