рабочая тетрадь(3)
.pdfЛабораторная работа 1.8
Автоматическая загрузка классов
Упражнение 1: Создание классов в отдельных файлах
•В текстовом редакторе откройте файл oop\users.php
•В текстовом редакторе создайте новый файл
•Перенесите описание абстрактного класса AUser из файла oop\users.php в новый файл
•Сохраните новый файл как oop\classes\AUser.class.php
•В текстовом редакторе создайте новый файл
•Перенесите описание класса User из файла oop\users.php в новый файл
•Сохраните новый файл как oop\classes\User.class.php
•В текстовом редакторе создайте новый файл
•Перенесите описание интерфейса ISuperUser из файла oop\users.php в новый файл
•Сохраните новый файл как oop\classes\ISuperUser.class.php
•В текстовом редакторе создайте новый файл
•Перенесите описание класса SuperUser из файла oop\users.php в новый файл
•Сохраните новый файл как oop\classes\SuperUser.class.php
•Сохраните файл oop\users.php
Упражнение 2: Использование автозагрузки файлов
•В файле oop\users.php (основной код) создайте и опишите функцию __autoload(), которая производит автозагрузку нужного класса при создании его экземпляра
•Сохраните файл oop\users.php
•Запустите браузер
•Наберите в адресной строке браузера http://mysite.local/oop/users.php
•Проверьте работу скрипта. Вы не должны увидеть никаких изменений. Если есть ошибки, найдите их и исправьте
class PropertyTest {
/** Место хранения перегружаемых данных. */ private $data = array();
public function __set($name, $value) { $this->data[$name] = $value;
}
public function __get($name) {
if (array_key_exists($name, $this->data)) { return $this->data[$name];
}
}
}
$obj = new PropertyTest; $obj->a = 1;
echo $obj->a . "\n\n";
class MethodTest {
public function __сall($name, $a) {
echo "Вызов метода '$name' ". implode(', ', $a);
}
/** PHP 5.3. Значение $name регистрозависимо! */ public static function __сallStatic($name, $a) {
echo "Вызов метода '$name' ". implode(', ', $a);
}
}
$obj = new MethodTest; $obj->foo("one", 2, "three");
MethodTest::foo("one", 2, "three");
class TestClass { public $foo;
public function __construct($foo) { $this->foo = $foo;
}
public function __toString() { return $this->foo;
}
}
$class = new TestClass('Привет'); echo $class;
class TestClass {
public function __invoke($var) { return $var * $var;
}
}
$obj = new TestClass(); echo $obj(5);
function foo(ClassA $obj) {
/* Ожидается только экземпляр класса ClassA */
}
function foo(callable $x) { return $x();
}
foo(['ClassName', 'staticMethodName']);
foo($object, 'methodName');
foo($invokableObject);
class User {
private $login, $password;
function __construct($login, $password) { $this->login = $login; $this->password = $password; $this->getUser();
}
private function getUser() {} public function __sleep() {
return array('login', 'password');
}
public function __wakeup(){ $this->getUser();
}
}
trait Hello {
function hello() {return 'Hello';}
}
trait User {
function user($name) {return $name;}
}
class Welcome {
use Hello, User;
}
$obj = new Welcome();
echo $obj->hello(), ' ', $obj->user('John'); /* Hello John */
trait Hello {
function hello() {return 'Hello';}
}
trait User {
function user($name) {return $name;}
}
trait Greeting { use Hello, User;
function sayHello($name) {
echo $this->hello(), ' ', $this->user($name);
}
}
class Welcome {use Greeting;}
(new Welcome())->sayHello('John');
trait Hello {
private function sayHello($name) { return 'Hello ',$name;
}
}
class Welcome {
use Hello {sayHello as public;}
}
$obj = new Welcome();
echo $obj->sayHello('John');