__wakeup()
__construct()
__set_state()
__set()
__call()
Абстрактные классы введены начиная с php5
Класс хотя бы с одним абстрактным методом должен быть объявлен как абстрактный
Абстрактный класс может содержать не абстрактные методы
Определение абстрактного метода может содержать тело метода
1) private
2) public
3) protected
1) private
2) protected
3) public
1) public
2) private
3) protected
1) public
2) protected
3) private
1) protected
2) private
3) public
class A { private $var1; public function __construct($var1) { $this->var1=$var1; } public function method1() { $a = new A(5); echo $a->var1; } } $cl = new A(10); $cl->method1();
10
5
Ничего
Сообщение о фатальной ошибке
Сообщение о том, что поле неопределенно
Пояснение: Объекты одного типа имеют доступ к приватным членам, даже если это разные екземпляры. Так как, реализация объектов уже известна внутри этих объектов http://php.net/manual/en/language.oop5.visibility.php#language.oop5.visibility-other-objects
<? class MyClass { public $myVar; function __constructor() { $this -> myVar = 5; } } $a = new MyClass; echo $a -> myVar; ?>
5
0
Ничего не выведет
Выведет ошибку
Пояснение: В PHP5 название конструктора "__construct", но это не мешает объявить свой метод "__constructor".
<? class test{ public $ab = 10; function __construct($a){ $this->ab = $a; } function __construct($a,$b){ $this->ab = $a+$b; } } $c = new test(20,10); echo $c->ab; ?>
10
20
30
Ошибка
Пояснение: В PHP не может быть два конструктора
<?php class c{ private $a = 42; function &a(){ return $this->a; } function print_a(){ echo $this->a; } } $c = new c; $d = &$c->a(); echo $d; $d = 2; $c->print_a(); ?>
422
4242
код вызовет ошибку
Пояснение: &a() возвращает ссылку на $a поэтому $d = &$a, потом присваивается $a = 2 и print_a() его и возвращает. $d = 2; это и будет $a = 2 после того как $d присвоилась ссылка на $a
== равны, если только тот же класс.
=== равны, если тот же экземпляр.
== должен быть тот же экземпляр.
=== те же самые свойства.
== равны, если тот же класс, свойства и значения.
=== равны, если тот же экземпляр и свойства.
== равны, если тот же самый класс, свойства и значения.
=== равны, если тот же самый экземпляр.
== равны, если те же самые свойства и значения.
=== равны, если тот же самый экземпляр и свойства.
Абстрактный класс не может иметь не абстрактные методы
final класс не может иметь абстрактных методов
Абстрактный класс не может иметь final методов
final класс не может иметь final методов
<?php abstract class cOlolo{ static function dontDoIt(){ print "wow"; } abstract function doIt(); } cOlolo::dontDoIt(); ?>
Сообщение об ошибке
wow + предупреждение
wow
<?php class Clazz { public $value; } $b = new Clazz; $b->newValue = 1; $a = $b; $a->newValue = 2; echo $b->newValue;
Ничего не напечатает
2
Ошибка, так как newValue не определена
1
<?php abstract class B { public $var = "B"; function __construct(){ $this->var = "B"; } } class E extends B { public $var = "E"; function __construct() { $this->var = "E"; } function __clone() { $this->var = "C"; } } $var1 = new B(); $var2 = new E(); $var3 = $var1; $var4 = clone($var2); $var5 =& $var4->var; $var2->var = "V";
function __clone() {
$var5 =& $var4->var;
$var1 = new B();
$var3 = $var1;
$var4 = clone($var2);
<?php class Base { function func() { echo " Base"; } function parent() { echo " None"; } } class Extended extends Base { function Func() { echo " Extended"; } function Parent() { echo parent::func(); } } class Extended2 extends Extended { function func() { echo " Extended2"; } function parent() { echo parent::Func(); } function grandpa() { echo parent::parent(); } } $var1 = new Base(); $var2 = new Extended(); $var3 = new Extended2(); $var1->func(); $var2->func(); $var3->func(); $var2->parent(); $var3->parent(); $var3->grandpa();
Base Extended Extended2 Base Extended Base
Base Base Extended2 None Extended None
Base Base Extended2 None Extended Base
Base Base Extended2 Base Extended Base
Base Extended Extended2 Base Extended None
class newClass { public $one = 'one'; private $two = 'two'; function two() { return 'three'; } } $obj = new newClass(); foreach ($obj as $v) { echo $v; }
Что выведется по окончанию работы скрипта?
Ничего не выведется
one
two
three
onetwo
Возникнет ошибка выполнения скрипта
Интерфейс может расширять несколько интерфейсов
Класс может реализовывать несколько интерфейсов
Абстрактный класс может реализовывать несколько интерфейсов
Методы с одинаковыми именами и сигнатурами могут существовать в нескольких интерфейсах, которые реализует данный класс