<?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
class parentClass {
public function printMe () {
print 'i am '.self::who();
}
public static function who () {
return 'parent';
}
}
class childClass extends parentClass {
public static function who () {
return 'child';
}
}
$node = new childClass();
$node->printMe();
i am parent
i am child
Зависит от версии php5
При выполнении возникнет ошибка
Пояснение: В данном случае происходит раннее статическое связывание, и self::who() на моменте компиляции сохраняется от родительского класса.
Абстрактный класс не может иметь final методов
final класс не может иметь final методов
final класс не может иметь абстрактных методов
Абстрактный класс не может иметь не абстрактные методы
abstract class BaseCls{
protected abstract function getName();
}
class ChildCls extends BaseCls{
}
Какие из реализаций метода getName() не валидны в классе ChildCls?
protected function getName(){}
function getName(){}
private function getName(){}
public function getName(){}
Методы с одинаковыми именами и сигнатурами могут существовать в нескольких интерфейсах, которые реализует данный класс
Класс может реализовывать несколько интерфейсов
Абстрактный класс может реализовывать несколько интерфейсов
Интерфейс может расширять несколько интерфейсов
<?php
class foo {
private $value = 42;
public function &getValue() {
return $this->value;
}
public function echoValue(){
echo $this->value;
}
}
$obj = new foo;
$myValue = $obj->getValue();
$myValue = 33;
$obj->echoValue();
?>
Сообщение об ошибке
33
42
0
Пояснение: http://www.php.net/manual/en/language.references.return.php
<?php
abstract class cOlolo{
static function dontDoIt(){
print "wow";
}
abstract function doIt();
}
cOlolo::dontDoIt();
?>
wow + предупреждение
Сообщение об ошибке
wow
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
Возникнет ошибка выполнения скрипта
Первая запись неверна для php
Вторая запись неверна для php
Вызов статического и динамического метода соответственно
Ни в чем
<?php
class Clazz {
public $value;
}
$b = new Clazz;
$b->newValue = 1;
$a = $b;
$a->newValue = 2;
echo $b->newValue;
Ошибка, так как newValue не определена
Ничего не напечатает
2
1
Интерфейс не может содержать реализации
Абстрактный класс не может содержать реализации
Класс, реализующий интерфейс, обязан предоставить имплементацию всех методов этого интерфейса
Ничем не отличаются
<?php
2: class dog {
3: public function bark() {
4: echo "Woof!";
5: }
6: };
7:
8: $foo = new dog;
9: $foo->bark();
?>
2
3
4
6
8
9
В этом коде нет ошибок
Ваш ответ:
Правильные ответы: instanceof,INSTANCEOF,instanceOf
interface iSingleton {
public static function getInstance();
}
class singleton implements iSingleton {
private static $instance = false;
final public static function getInstance() {
return (self::$instance) ? self::$instance : self::$instance = new self;
}
private function __construct(){}
private function __clone(){}
function f1(){
echo 'Singleton::f1()';
return $this;
}
}
class cl1 extends singleton{
function f1(){
parent::f1();
return $this;
}
function f2(){
echo 'cl1::f2()';
return $this;
}
}
cl1::getInstance()->f1()->f2();
Singleton::f1()cl1::f1()
Fatal Error
Singleton::f1()cl1::f2()
Notice
cl1::f2()cl1::f2()
Пояснение: Позднее статическое связывание в паттерне "Одиночка" через перенаправленный вызов self. self использует класс, к которому она принадлежит, в данном случае это класс singleton, а он не имеет метода f2(), который вызывается с класса cl1.