[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Работа с необъявленными свойствами класса
WinterSilence

class Foo
{
public function testIt()
{
return $this->test;
}
}


$ab = new Foo;
$ab->test = 4;
echo $ab->testIt();

Не могу понять почему этот код не вызывает ошибку, ведь свойство $test не заявлено в классе.
Хотелось бы найти этому объяснение ;)
Игорь_Vasinsky
$ab->test = 4;

ты же его сам создал)

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Invis1ble
Очевидно, что php создает свойство на лету при присвоении значения.

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

zeromind
тоже раньше это заметил, так зачем вначале класса объявляют свойства класса списком? =) для наглядности ? ))
killer8080
Цитата (WinterSilence @ 30.03.2014 - 10:14)
Не могу понять почему этот код не вызывает ошибку, ведь свойство $test не заявлено в классе.

а теперь так попробуй user posted image
class Foo
{
public function testIt()
{
return $this->test;
}
}


$ab = new Foo;
//$ab->test = 4;
echo $ab->testIt();
WinterSilence
@killer8080 разница между notice и error как бэ большая

есть же еще __get(), __set() и как оно вместе сосуществует тоже мало понятно или магия полностью перекрывает описанный выше вариант?
killer8080
Цитата (WinterSilence @ 30.03.2014 - 10:56)
есть же еще __get(), __set() и как оно вместе сосуществует тоже мало понятно

а что тут непонятного? Магические методы перехватывают обращение к несуществующим свойствам.



Спустя 1 минута, 15 секунд killer8080 написал(а):
Цитата (WinterSilence @ 30.03.2014 - 10:56)
@killer8080  разница между notice и error как бэ большая

наличие нотисов в коде говорит о квалификации программиста wink.gif




Спустя 8 минут, 18 секунд killer8080 написал(а):
кстати, а что собственно удивляет? Массивы ведут себя так же
$o = new stdClass;
$a = array();

$o->foo = 'foo';
echo $o->foo; // foo
echo $o->bar; // Notice: Undefined property: stdClass::$bar in...

$a['foo'] = 'foo';
echo $a['foo']; // foo
echo $a['bar']; // Notice: Undefined index: bar in...
WinterSilence
В общем получается чтобы "джуниоры" явно не писали абы как, надо наследовать классы от "пустышки" с __get(), __set().
Странно что раньше этого никогда не замечал..
Ладно, в любом случае всем отписавшимся спасибо, тему можно прикрыть)
killer8080
Цитата (WinterSilence @ 30.03.2014 - 11:08)
В общем получается чтобы "джуниоры" явно не писали абы как, надо наследовать классы от "пустышки" с __get(), __set().

blink.gif
какой то странный вывод. Чтобы не писали абы как, ошибки нужно включать в разработке, и не допускать нотисов, из соображений
Цитата (WinterSilence @ 30.03.2014 - 10:56)
разница между notice и error как бэ большая

WinterSilence
@killer8080 " Массивы ведут себя так же" бывают и фиксированной длины если что) да и вообще сравнение ни о чем.

Я думал что классы в PHP имеют фиксированную структуру. *авуй
killer8080
Цитата (WinterSilence @ 30.03.2014 - 11:15)
@killer8080  " Массивы ведут себя так же" бывают и фиксированной длины если что)

ты наверно ЯП попутал, в PHP массивы не имеют фиксированной размерности, если это был намек на SplFixedArray, то это не массив, а особый объект, реализующий синтаксическую функциональность массива.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.