1

Тема: Допоможіть розібратися в документаціїї PHP (ООП)

Доброго дня.
Сьогодні вирішив освіжити свої знання з php зайшов на http://www.php.net/manual/ru/language.oop5.basic.php і зустрів речі які я номожу зрозуміти. Наприклад в лістингу #4

$instance = new SimpleClass();

$assigned   =  $instance;
$reference  =& $instance; 

$instance->var = '$assigned будет иметь это значение';

$instance = null; // $instance и $reference становятся null

var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>

$reference  =& $instance;
що це за присвоєння по подвійній силці?

--------------------

також я не можу зрозуміти деякі речі в лістингу #5

<?php
class Test
{
    static public function getNew()
    {
        return new static;
    }
}

class Child extends Test
{}

$obj1 = new Test();
$obj2 = new $obj1;
var_dump($obj1 !== $obj2);

$obj3 = Test::getNew();
var_dump($obj3 instanceof Test);

$obj4 = Child::getNew();
var_dump($obj4 instanceof Child);
?>

return new static; - чимось схоже на c++  завинятком того що в c++ ставиться тип, а не ключове слово static;
але це ж php i static мав би бути класом.

$obj1 = new Test();
$obj2 = new $obj1;

як таке можливо? в $obj1 лежить не назва класу а обєкт, хіба можна з оєкта створювати оєкт?

2

Re: Допоможіть розібратися в документаціїї PHP (ООП)

$reference  =& $instance;
що це за присвоєння по подвійній силці?

Отже моє бачення цієї картини:

Прихований текст
$instance = new SimpleClass();
$assigned = $instance; 
 // $assigned звязаний з класом SimpleClass



$reference  =& $instance;  
// $reference звязаний із змінною instance 

 $instance = new stdClass();

     var_dump($instance);
      var_dump($reference);
      var_dump($assigned);


object(stdClass)#28 (0) {
}
object(stdClass)#28 (0) {
}
object(A)#27 (1) {
  ["var"]=>
  string(55) "$assigned будет иметь это значение"
}

Фактично схема ссилок досить заплутана але у всіх мовах є свої підводні камені. Я просто так не пишу і все =)

питання номер 2

але це ж php i static мав би бути класом.

чого це статік мав би бути класом? Як на мене цілком логічне пояснення. static веде на поточний екземпляр класу, а self веде на клас у якому знаходиться виклик. Мабуть для новачків це заплутано але ось гляньте приклад


Прихований текст
  class B {

    public function newSelf() {
      return new self();
    }

    public function newStatic() {
      return new static();
    }

  }

  class A extends B {

  }

  $a = new A();
  $self = $a->newSelf();

  $static = $a->newStatic();

  var_dump($self);
  var_dump($static);

object(B)#26 (0) {
}
object(A)#27 (0) {
}

як таке можливо? в $obj1 лежить не назва класу а обєкт, хіба можна з оєкта створювати оєкт?

так з обєкта можна створювати обєкт. Як воно насправді паше я не вникав, але тут не бачу нічого фантастичного ;)

Особисто я так не пишу.  У мене максимум це може бути ось так

$className = 'Table';
$table  = new $className();

Успіху у навчанні ;)

Подякували: bodya-00281

3

Re: Допоможіть розібратися в документаціїї PHP (ООП)

Я правильно зрозумів вас?

$assigned   =  $instance;      
// $assigned  вказує безпосередньо на обєкт класа SimpleClass

$reference  =& $instance;    
 // $reference вказує на змінну $instance, що в $instance запхаєм те і будем мати в $reference

---------
static - вертає назву класа, обєкт якого був створенй
self    - вертає назву класа, в якому був використаний self

4

Re: Допоможіть розібратися в документаціїї PHP (ООП)

На рахунок посилань ви правильно зрозуміли ;)

static - вертає назву класа, обєкт якого був створенй
self    - вертає назву класа, в якому був використаний self

я б не казав "вертає назву класу" я б сказав "посилається на клас" так як він реально нічого не повертає ;)

5 Востаннє редагувалося koala (14.05.2014 14:43:57)

Re: Допоможіть розібратися в документаціїї PHP (ООП)

bodya-0028 написав:

що це за присвоєння по подвійній силці?

PHP - не найкраща мова, щоб вчити ООП, але спробую пояснити. Отже, коли ми пишемо

$a=1;

в PHP це означає, що (умовно) в таблиці змінних створюється (чи змінюється, якщо така змінна вже існувала) рядок: "змінна $a - значення 1". Це викликає питання? Якщо ні, то поїхали далі.
Є така річ, як посилання (оцей &). Посилання - це інше ім'я тієї самої змінної. Як це працює:

$b = &$a;

(бажано & додавати саме до змінної, а не до = ) змінює в таблиці змінних рядок на "змінна $b - див. змінну $a". Тепер

$b = 2; echo $a;

виведе 2. $b - псевднонім для $a. Розібралися? Поїхали далі.

ООП вимагає незалежного існування об'єктів і змінних. Тобто

$instance = new SimpleClass();

означає, що десь (для простоти скажемо, що в таблиці об'єктів) створюється екземпляр класу SimpleClass, а в таблицю змінних додається "змінна $instance - значення таблиця_об'єктів[100]" чи якось так.

$assigned   =  $instance;

означає створення рядку в таблиці "змінна $assigned - значення таблиця_об'єктів[100]". Той самий об'єкт, але інша змінна. Тепер ясно? Ми створюємо псевдонім $reference для $instance, записуємо в $instance null, це, зрозуміло, записує null і в $reference - але об'єкта ніхто не торкався, і він чудово собі існує і повертає значення, коли assigned до нього звертається. Питання?
Ось, до речі, те саме на оф. сайті.

Подякували: bodya-00281

6

Re: Допоможіть розібратися в документаціїї PHP (ООП)

bodya-0028 написав:

return new static; - чимось схоже на c++  завинятком того що в c++ ставиться тип, а не ключове слово static; але це ж php i static мав би бути класом.

В PHP static має два різні значення: одне, про яке ви сказали, і друге - власний клас, на випадок, коли не існує екземплярів.

bodya-0028 написав:

як таке можливо? в $obj1 лежить не назва класу а обєкт, хіба можна з оєкта створювати оєкт?

new приймає три види параметрів: назву класу, змінну з назвою класу і об'єкт класу - тоді створюється об'єкт того самого класу; це зроблено для зручності, щоб не писати щось типу

$obj2 = new decltype( $obj1 );