Бага в PHP?

Wicked

Новичок
Ну private то недоступны в данном случае, и правильно что недоступны...
PHP:
class B { 
    private $bar = 47; 
    function foo() { 
        $b = new B; 
        echo $b->bar; // Will output 47 without any error 
    } 
} 
$b = new B; 
$b->foo();
PHP:
class B { 
    protected $bar = 47; 
    function foo() { 
        $b = new B; 
        echo $b->bar; // Will output 47 without any error 
    } 
} 
$b = new B; 
$b->foo();
-~{}~ 07.09.06 19:41:

а про что говоришь ты - там уже нюансы разницы между private и protected в случае с наследованием.
 

denver

?>Скриптер
wizard
denver
Дописал, проверил.
47.
Что-то не так?
Код в студию. И версию PHP до кучи.

-~{}~ 07.09.06 16:44:

Wicked
Блин, значит и private туда-же... Ну это уж совсем leak получается.
 

wizard

Новичок
PHP:
<?php
class A { 
    protected $bar = 47; 
} 

class B extends A { 
    function foo() { 
        $a = new A; 
        echo $a->bar; // Fatal error: Cannot access protected property A::$bar in 
    } 
} 

$b = new B; 
$b->foo();
?>
Выводит "47".
php version 5.1.4

Каменты оставил :) Ибо лень удалять было

Только тут дело не в версии php 5 :)
 

Wicked

Новичок
denver
а как иначе делать factory, задающие private/protected св-ва объектам?
 

denver

?>Скриптер
wizard
Хм, у меня 5.0.4 на это тоже ругается:
Fatal error: Cannot access protected property A::$bar in ...

-~{}~ 07.09.06 16:51:

Wicked
Я бы сказал их нужно через конструктор передавать, необязательными параметрами. А то что-же это получается. Любой Factory может их менять? И его что при этом, от нужного класса наследовать нужно?
 

Wicked

Новичок
я имел в виду factory типа

PHP:
class obj () {
  ...
  static function createObj () {
    $obj = new obj();
    $obj->privateProp = 1;
    return $obj;
  }
}
 

wizard

Новичок
denver
Странно... Может я ошибся, насчёт версии php 5, так что рой чейнжлог :) Может найдёшь, я что-то не нашёл.

Сейчас подниму 5.0.4, проверю :)

Воспроизвёл ошибку. Походу бага. Обновляйся.
 

denver

?>Скриптер
Wicked
От блин, никогда бы не подумал что это оопэшно - вклиниваться после конструктора и менять private переменную :( Хотя б и в новом экземляре себя же.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
на 5.2 доступ к полям есть,
а с 5.0 давно пора уходить - там багов много и ветку ту забросили
 

uliss

Новичок
Пример на C++
Код:
#include <iostream>
using namespace std;
class A{
        public:
        A():bar(47),bar2(57){}

        void foo(){
                A * b = new A();
                cout << "bar:" << b->bar << endl;
                cout << "bar2:" << b->bar2 << endl;
                delete(b);
        }
        protected:
        int bar;
        private:
        int bar2;
};


int main(){
        A * a = new A();
        a->foo();
        delete(a);
}
Выводит:
bar:47
bar2:57


Тоже бага? ;))
 
Сверху