Область видимости объекта базового класса

ForJest

- свежая кровь
[DAN]
В четвёрке нет области видимости. Поэтому значение сразу же перекрывается новым, когда ты определяешь var повторно.
Убери область видимости и в пятёрке будет то же поведение - всё нормально.
 

[DAN]

Старожил PHPClub
Но опять же, заменяем private на protected в базовом классе (БК), и свойство ($var) производного класса (ПК) тут же перекрывает свойство ($var) базового класса.
 

ForJest

- свежая кровь
[DAN]
Да - и это является нормальным поведением - ты же присваиваешь новое значение этому полю.
Всё равно что ты пишешь $this-> var = 'value';
 

[DAN]

Старожил PHPClub
svetasmirnova, это понятно.
Но объект ПК также несет в себе функциональность БК, что очевидно. Так почему же пхп размывает эту грань, и сливает всё в один большой отстойник?
Хорошо хоть методы БК корректно отрабатывают. А вот со свойствами полная беда :/

ForJest, видимо по той же причине указатель this проявляет себя в методах БК как указатель на объект ПК, хотя по идее в БК он должен вести себя именно как указатель на объект БК.

Опять же непонятно, почему пхп4 держит разные таблицы функций для методов БК и ПК, но не делает этого для свойств?

-~{}~ 23.09.05 03:00:

ForJest, разве у меня свойства базового и производного класса не живут своей половой жизнью?
Для ПК это поведение понятно, типа перегрузки функций. Но зачем и в БК переопределять свойство для всего объекта?
 

ForJest

- свежая кровь
[DAN]
Потому что ты ему присвоил значение. Полностью аналогично тому как если бы ты ЯВНО вызвал
$this-> var = 'New value';
После этого оно принимает новое значение, в пределах объекта. Не важно какого класса - базового или производного :).
В целом, [DAN], должен тебе со всей ответсвенностью заявить что ты тупишь :).
 

Screjet

Новичок
Собственное поведение БК может быть только в ПХП5. Причина очевидна: в ПХП4 инкапсуляция попросту отсутствует.
 

[DAN]

Старожил PHPClub
Похоже на правду. Хотя я бы не сказал, что совсем отсутствует. Методы все же субординируются по принадлежности к классам.
Эх, жаль...

-~{}~ 23.09.05 03:26:

ForJest, теперь уже понятно, что для пхп это поведение свойственно, хоть оно в корне неправильно. Просто в С++ такое поведение не прокатывает.
 

Screjet

Новичок
Хотя я бы не сказал, что совсем отсутствует. Методы все же субординируются по принадлежности к классам.
Поведение определяется состоянием (не методами), а в ПХП4 состояние БК === ПК.
 

svetasmirnova

маленький монстрик
Эээхх! [DAN], ты просил код на C++? Получи. Я только учусь писать на этом языке, к сожалению, так что прошу прощения за стиль. Итак, корявенький код на C++, реализующий данную фичу:
PHP:
#include <iostream>
#include <typeinfo>
using namespace std;

class Foo
{
	public:
	Foo() {
		cout << typeid(this).name() << endl;
	}
	int FooBar();
	virtual int Bart() {
		cout << "foo--" << typeid(this).name() << endl;
		
		return 1;
	}
};

class Bar : public Foo
{
	public:
	Bar() {
		cout << typeid(this).name() << endl;
	}
	virtual int Bart() {
		cout << "bar--" << typeid(this).name() << endl;
		
		return 1;
	}
};

int Bar::Foo::FooBar() {
	return this->Bart();
};

int main () {
	
   Foo *a = new Foo();
   Bar *b = new Bar();
   
   b->Bart();
   b->FooBar();
   
   return 0;
}
 

jdoe

Новичок
А теперь почувствуй разницу в данном случае между

Foo *b = new Bar();
и
Bar *b = new Bar();

:)
 

[DAN]

Старожил PHPClub
svetasmirnova
FooBar() наследуется классом Bar от Foo, что вполне закономерно и так должно быть. Но метод-то определен в базовом классе Foo, а не в Bar. Если б мы определили FooBar() в классе Bar и вызвали бы его для объекта класса Foo, это было бы именно то поведение, которое я не мог понять.
С++ в этом случае выдаст ошибку кмпиляции, что логично.

-~{}~ 23.09.05 04:36:

jdoe и что такого? Указатель базового класса вполне может содержать ссылку на объект производного, и этим весьма успешно пользуются... не понял твоего юмора.
 
[DAN], блин...

имхо, тут полное непонимание идей ООП. Неважно какая раелизация, будь то C++, Java или Php...

1. есть базовый класс A
2. есть произодный от него B, который унаследовал от A все его свойства и метоты.... некоторые из них он мог переопределить под себя, + добавить новые

так вот B - это собственная законченная структура данных... она ни от кого не зависит. Все ее методы - это только ее методы(объекты), включая $this, и здесь неважно откуда они взялись: были унаследованы, переопределены или созданы.


+-----------------
Отвечая на первый вопрос:
PHP:
class simple{ 
    function simple() { 
        $this->foo(); // НЕПРАВИЛЬНО в этом классе НЕТ foo
    } 
} 

class complex extends simple { 
    function foo() { 
        echo "complex::foo() is called from simple::simple()"; 
    } 
}
з.ы. сорри, что влез в разговор.
 

svetasmirnova

маленький монстрик
[offtop]
>$this->foo(); // НЕПРАВИЛЬНО в этом классе НЕТ foo
Кстати, фича: имитация абстрактных методов для PHP4. Жалко, не нужно уже =)
 
Сверху