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

Общие вопросы
При сравнении объектов класса, каким образом операторы == и === отличаются между собой?
  • == равны, если только тот же класс.
    === равны, если тот же экземпляр.

  • == должен быть тот же экземпляр.
    === те же самые свойства.

  • == равны, если тот же класс, свойства и значения.
    === равны, если тот же экземпляр и свойства.

  • == равны, если тот же самый класс, свойства и значения.
    === равны, если тот же самый экземпляр.

  • == равны, если те же самые свойства и значения.
    === равны, если тот же самый экземпляр и свойства.

Нюансы ООП в PHP
Что будет выведено в результате работы кода?
abstract class First {       private $a = 5;              abstract public function getVar();   }      class Second extends First {       public function getVar() {         return $this->a;       }   }      $obj = new Second();   echo $obj->getVar(); 
  • Не будет выведено ничего

  • Фатальная ошибка из-за попытки доступа к члену класса с модификатором private

  • 5

  • Замечание (Notice) о попытке доступа к неопределённому свойству

Пояснение: First::a является невидимой для класса-наследника.

Общие вопросы
Какой фрагмент вы используете, чтобы создать экземпляр объекта?
  • $object = new Object();

  • $object = Object(new);

  • $&object::new Object();

  • $object&=Object();

  • $object->new Object();

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

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

Ваш ответ:  

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

Практические вопросы
Что выведет на страницу код?
<?php abstract class cOlolo{     static function dontDoIt(){         print "wow";     }     abstract function doIt(); }  cOlolo::dontDoIt(); ?> 
  • Сообщение об ошибке

  • wow

  • wow + предупреждение

Общие вопросы
Вам необходимо установить следующие области видимости для атрибутов класса: 
1) Везде
2) Потомки, предки, и текущий класс;
3) Только текущий класс

Какие ключевые слова нужно использовать в каждом из этих трёх случаев?
  • 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

Общие вопросы
Какое ключевое слово нужно использовать, чтобы объявить $objtwo как копию существующего объекта $objone, вместе со всеми значениями его свойств?
  • new

  • duplicate

  • clone

  • static

  • use

Практические вопросы
Что будет находится в свойстве $css обьекта $c?
class c {     public $css;     function make_bold(){         $this->css .= 'bold';         return $this;     }     function make_italic(){         $this->css .= 'italic';         return $this;     } }  $c = new c(); $c->make_bold()->make_italic(); echo $c->css; 
  • ничего, код вызовет ошибку

  • bold

  • italic

  • bolditalic

Пояснение: Функции и методы класса, которые возвращают обьект, действуют как обьект

Нюансы ООП в 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
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()';     }      }  class cl1 extends singleton{     function f1(){         echo 'cl1::f1()';     } }  class cl2 extends singleton{     function f1(){         echo 'cl2::f1()';      } }  cl1::getInstance()->f1(); cl2::getInstance()->f1(); 
  • cl2::f1()cl2::f1()

  • Notice

  • cl1::f1()cl2::f1()

  • Fatal Error

  • cl1::f1()cl1::f1()

  • Singleton::f1()Singleton::f1()

Пояснение: Позднее статическое связывание в паттерне "Одиночка" через перенаправленный вызов self. self использует класс, к которому она принадлежит, в данном случае это class singleton. getInstance() всегда возвращает единственный и тот же самый экземпляр объекта. Первым была вызвана инициализация объекта cl1, все последующие инициализации будут возвращать первый инициализированный объект

Общие вопросы
Вы работаете в команде программистов. Проект разделён на несколько функциональных частей. Вы работаете над специализированными классами форматирования, которые позже будут добавлены в главный проект. Укажите, что вы будете использовать, чтобы избежать возможный конфликт имён?
  • Использую перегрузку функций

  • Определю прототипы функций

  • Определю пространства имён

  • Использую сборщик мусора в памяти

  • Использую контроль типов

Нюансы ООП в 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(); 
  • Notice

  • Fatal Error

  • Singleton::f1()cl1::f2()

  • cl1::f2()cl1::f2()

  • Singleton::f1()cl1::f1()

Пояснение: Позднее статическое связывание в паттерне "Одиночка" через перенаправленный вызов self. self использует класс, к которому она принадлежит, в данном случае это класс singleton, а он не имеет метода f2(), который вызывается с класса cl1.

Практические вопросы
Заданы классы:
abstract class BaseCls{     protected abstract function getName(); }  class ChildCls extends BaseCls{  } 
Какие из реализаций метода getName() не валидны в классе ChildCls?
  • protected function getName(){}

  • function getName(){}

  • private function getName(){}

  • public function getName(){}