Тест "ООП в PHP 5"

Нюансы ООП в 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

Нюансы ООП в PHP
Какой результат выполнения следующего кода?
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 и abstract?
  • Абстрактный класс не может иметь 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 5.4+)?
  • Методы с одинаковыми именами и сигнатурами могут существовать в нескольких интерфейсах, которые реализует данный класс

  • Класс может реализовывать несколько интерфейсов

  • Абстрактный класс может реализовывать несколько интерфейсов

  • Интерфейс может расширять несколько интерфейсов

Нюансы ООП в PHP
Какое значение будет выведено на экран при выполнении следующего кода:
<?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

  • Возникнет ошибка выполнения скрипта

Общие вопросы
В чем отличие записей Class::method() и $Class->method() ?
  • Первая запись неверна для php

  • Вторая запись неверна для 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
В какой строке кода допущена ошибка:
<?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

  • В этом коде нет ошибок

Общие вопросы
Какой оператор в PHP5 определяет является ли объект экземпляром класса, потомком класса или реализующим интерфейс:

Ваш ответ:  

Правильные ответы: instanceof,INSTANCEOF,instanceOf

Нюансы ООП в PHP
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.