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

Нюансы ООП в PHP
Что выведет данный скрипт в результате своей работы?
<?php
class MyClass {
   public $myVar;
   function __constructor() {
     $this -> myVar = 5;
   }
}
$a = new MyClass;
echo $a -> myVar;
?>
  • 5

  • 0

  • Ничего не выведет

  • Выведет ошибку

Пояснение: В PHP5 название конструктора "__construct", но это не мешает объявить свой метод "__constructor".

Нюансы ООП в PHP
Данный код выведет ошибку. В какой строке?
                    <?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";  
  • $var4 = clone($var2);

  • function __clone() {

  • $var5 =& $var4->var;

  • $var3 = $var1;

  • $var1 = new B();

Практические вопросы
Дан класс:
<?php class One {   public $param = 5;      protected function __construct() {         $this->param = 10;       }      public static function getInstance() {     return new One();   }  } 
Какие верные варианты его использования и что выведется на экран?
  • $asdf = new One(); echo $asdf->param; 
    Выведется 5

  • $asdf = new One(); echo $asdf->param; 
    Выведется 10

  • $asdf = One::getInstance(); echo $asdf->param; 
    Выведется 10

  • $asdf = One::getInstance(); echo $asdf->param; 
    Выведется 5

  • Все вышеперечисленные варианты приведут к ошибке

Пояснение: Если конструктор класса защищен, то создание объекта данного класса приведет к ошибке.

Общие вопросы
Чтобы определить программный код, который будет выполняться каждый раз, когда создается новый экземпляр класса, вы добавите код внутри какого магического метода?
  • __wakeup()

  • __construct()

  • __set_state()

  • __set()

  • __call()

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

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

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

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

  • Fatal Error

  • cl2::f1()cl2::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 static;     }          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();  
  • cl1::f1()cl2::f1()

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

  • Fatal Error

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

  • Notice

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

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

Практические вопросы
Что выведет следующий код?
<?php class People {  public function greeting() {    echo "A nice smile for you. ";  } } trait MyParents {   public function greeting() {   parent::greeting();   $this->greeting2();   echo "A big hug for you. ";  } } class MyMom extends People {  use MyParents;  public function greeting2() {     echo "A big kiss for you. ";  } } class MyDad extends People {  use MyParents;  public function greeting2() {     echo "A strong handshake for you. ";  } }  $person = new MyMom(); $person->greeting(); ?> 
  • A big kiss for you. A big hug for you. A strong handshake for you.

  • A nice smile for you. A big hug for you. A strong handshake for you.

  • A nice smile for you. A big kiss for you. A big hug for you.

  • A nice smile for you. A big hug for you. A strong handshake for you.

  • A strong handshake for you. A big hug for you.

Общие вопросы
Чем отличается абстрактный класс от интерфейса?
  • Интерфейс не может содержать реализации

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

  • Класс, реализующий интерфейс, обязан предоставить имплементацию всех методов этого интерфейса

  • Ничем не отличаются

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

Ваш ответ:  

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

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

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

Общие вопросы
Вам необходимо установить следующие области видимости для атрибутов класса: 
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

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

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

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

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

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

Общие вопросы
Что из следующих утверждений верно относительно ключевых слов final и abstract?
  • Абстрактный класс не может иметь не абстрактные методы

  • final класс не может иметь final методов

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

  • final класс не может иметь абстрактных методов

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

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

  • wow