проблемы с ООП

env0der

Guest
проблемы с ООП

Код:
[PHP]
class FOO
{
    var $a;
    var $b;
    function FOO($a_,$b_)
    {
        $this->$a=$a_;
        $this->$b=$b_;
    }
}

$f=new FOO(1,2);
print $f->$a;
print $f->$b;
[/PHP]

Этот код почему-то выводит "22".
В чем может быть проблема?

php версии 4.3.1
 

neko

tеam neko
$this->a

странно что этот код вообще что-то выводит

rtfm
 

alpine

Новичок
Интересная багофича, получается конструкция:
PHP:
$a = null;
$this->$a = 2;
вполне рабочая, даже нотайсы не выводятся :D
 

Screjet

Новичок
PHP:
class a {
  function a(){
    $a = 3;
    $this->{''} = 2;
    $this->{2} = 2;
    $this->$a = 2;
    $this->a = 2;
  }
}

$a = new a;
print_r($a);
 

Rammstein

PHPClub::News
Вобщем если просто, то в случае
$this->$a = 'b';
Ты присваиваешь значение 'b' атрибуту с именем, находящимся в переменной $a, текущего объекта. А в данном случае ты скорее хотел присвоить атрибуту a текущего объекта значение 'b'. Это будет выглядеть так:
$this->a = 'b';
Думаю более-менее понятно)
 

confguru

ExAdmin
Команда форума
env0der

Только сейчас дошло...
вот что значит выходной.. :)
Надо будеь добавить в тест по php

PHP:
class FOO
{
    var $a;
    var $b;
    function FOO($a_,$b_)
    {
        $this->a=$a_;
        $this->b=$b_;
    }
}

$f=new FOO(1,2);
print $f->a;
print $f->b;
-~{}~ 10.09.05 21:51:

env0der

В твоем примере
$a и $b неопределены в 4 строчках

-~{}~ 10.09.05 21:54:

Screjet

Вот так нормально выводит PHP 5.0.4

a Object
(
[:private] => 2
[2] => 2
[3] => 2
[a] => 2
)
 

ONK

Пассивист PHPСluba
На сколько я помню, имена переменных (и свойств классов) в ПХП не могут начинаться с цифры, так что тут можно рассмотреть багу (отсутствие контроля над именами переменных на этапе исполнения).
 

Screjet

Новичок
alpine
В пятерке работает. Меня это не только радует, но и активно юзаю эту фитчу.

ONK
PHP:
$a = 'Hello World';
${$a} = 2;
echo ${'Hello World'};
имхо, это нормальное поведение
 

alpine

Новичок
Согласен с ONK
1) То что происходит идет в разрез с:
Ман: Переменные
Имена переменных соответствуют тем же правилам, что и остальные наименования в PHP. Правильное имя переменной должно начинаться с буквы или символа подчеркивания с последующими в любом количестве буквами, цифрами или символами подчеркивания Это можно отобразить регулярным выражением: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
2) Фигурные скобки должны использоваться в переменных переменных для того чтобы решить проблему двусмысленности, а не для того чтобы обойти пункт 1.
Вот такое мое IMHO.
 

Screjet

Новичок
alpine
Както давным давно с Тони спорили на форуме по поводу переменных переменных, когда ввели синтаксис:
PHP:
// переменные переменные, альтернативный синтаксис (или основной?)
$$a = 2;
$this->$a = 2;
Тогда я ошибочно утверждал, что конструкция
$this->$a = 2;
работать не будет и предлагал делать однозначно:
$this->{$a} = 2;

имхо, сие изменение повлекло больше ошибок и неясностей.

А до этого необходимо было однозначно определять переменные переменные фигурными скобками (кажись до версии 4.2.3, точно не помню). Что положительно сказывалось на порядке и понимании кода (собственно сам постоянно пользуюсь фигурными скобками для однозначности). Вероятно, для обратной совместимости оставили синтаксис со скобками, что радует и дает возможность однозначно определять переменные переменные.
 

ONK

Пассивист PHPСluba
Лично моё мнение, правила наименования переменных должны соблюдаться вне зависимости от способа наименования.
Не вижу смысла в возможности использования в качестве имени переменной негораниченного набора символов произвольной длинны.
 
Сверху