Выполняю лабораторную работу №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
}
___________________________________________________________
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 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;
}
Функция __autoload была заменена на spl_autoload_register ещё в версии 5.1.
Основным преимуществом spl_autoload_register является возможность использовать несколько автозагрузчиков. В php 7.2 будет выбрасываться Deprecation notice на стадии компиляции.
/**
* Включаем автозагрузку классов в PHP с использованием SPL.
*/
spl_autoload_extensions('.php');
spl_autoload_register();
написал : spl_autoload_register(function ($class) {
include 'classes/' . $class . '.class.php';
});
Так же указывал через полный путь:
include $_SERVER['DOCUMENT_ROOT'] . "/less3/oop/classes/".$name . ".class.php";
класс не видит. Версия PHP-5.4
Всем большое спасибо за поддержку!!!
Забыл подключить абстракцию и интерфейс,из-за чего не находило наследуемый и реализуемый от них классы.
Вопрос решён:)
да,в этой строке есть ошибка.
Но без нее не происходит автозагрузка класса.
Путь к классам: D:\OpenServer2\domains\lessonsPHP2016.local\less3\oop\classes
пробовал через $_SERVER['DOCUMENT_ROOT'], __DIR__, не вышло :\