Объясните дураку ооп. Видимость переменных в разных инстансах.

Фанат

oncle terrible
Команда форума
PHP:
class db {
  static $d;
}
$db = new db();
$db::$d = 1;

$db1 = new db();
var_dump($db1::$d);
Я ожидал увидеть хрен по всей морде, а увидел int(1)
Для меня такой код был все равно что
PHP:
$a = array();
$a[0] = 1;
$a1 = array();
var_dump($a1[0]);
- $db1 и $db, как и $a и $a1 - разные переменные. И какого хрена они влияют на друг на друга?
Объясните, где я дурак и чего не понимаю
 

Ragazzo

TDD interested
Дак это же переменные класса, а не объектов, им все равно на объекты, они для них одни и те же. Ты так шутишь чтоли про свои незнания?) В том же питоне тоже самое будет для переменных класса.
 

Фанат

oncle terrible
Команда форума
Нет, не шучу. Я всегда думал что класс - это типа структуры, шаблон для создания переменной. А получается, что нет.
 

Ragazzo

TDD interested
Фанат
ты же static написал впереди. Тот же эффект будет если в функции объявить переменную как static.
 

Фанат

oncle terrible
Команда форума
объект получается как фотон - обладает одновременно свойствами ЭМ волны и материальной частицы - функции и переменной
 

Ragazzo

TDD interested
Фанат
если честно я удивлен как ты не знал про такую очевидную вещь, ну т.е. ты знаешь кучу интерналс фишек и прочих флагов-свичей специфических, а такого не знал :S
 

MiksIr

miksir@home:~$
Да ладно, я тут с удивлением на днях узнал, что unset($this->property) убирает это свойство нафиг из объекта =) Долго баг ловил ;)
 

С.

Продвинутый новичок
У одного неожиданно статик переменная ведет себя как... статик. У другого unset() неожиданно уничтожает переменную.
Вот она весна пришла...
 

itprog

Cruftsman
А документация вообще говорит: A property declared as static can not be accessed with an instantiated class object (though a static method can) ;s
 

cDLEON

Онанист РНРСlub
Это вполне логично. Но вот это меня убивает:
PHP:
<?php
class A {
 static $a;
 static function set_a($_a) {
  static::$a = $_a;
 }
};

class B extends A{};

B::set_a('a');
var_dump(A::$a);
Угадайте какой будет var_dump ?
 

Ragazzo

TDD interested
cDLEON
не ну зачем late-binding городить то и говорить "Но вот это меня убивает:", таких примеров можно придумать вообще кучу с "подвохами".
 

itprog

Cruftsman
С.
м?

для меня $db это объект класса, а про -> там отдельно: Static properties cannot be accessed through the object using the arrow operator ->.
 

MiksIr

miksir@home:~$
У другого unset() неожиданно уничтожает переменную.
Не переменную, а свойство класса. Даже и не думал, что кому-то это в голову придет - реализовать такое. Может, раз такой умный, скажешь как ее обратно вернуть? Переменную вот могу определить снова, а свойство _класса_ то как? С учетом того, что у нас этот класс полон магии.
 

Вурдалак

Продвинутый новичок
MiksIr, свойства класса (не класса, а объекта, если точнее) и есть переменные, только со своей областью видимости. Соответственно, создавать так же: $this->blabla = 'woot woot'.
 

MiksIr

miksir@home:~$
$this->blabla
Это свойство больше не определено в объекте, сработает магия.
 

Вурдалак

Продвинутый новичок
В __set() устанавливай. Но возникает вопрос: если ты определил __set(), то какого хера у тебя нет __unset()?
 
Сверху