X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Переопределение родительских классов
PRStudio
PRStudio
Topic Starter сообщение 3.10.2011, 1:22; Ответить: PRStudio
Сообщение #1


И снова здравствуйте!
Возник очень интересный (для меня) вопрос:
Возможно ли переопределять отдельные методы родительских классов в дочерних, при этом используя объекты родительских. Т.е., предположим, есть у меня класс parent и класс child. Допустим, что класс parent содержит метод:
[PHP]public function print_hello(){
echo "Hello world!";
}[/PHP]

Теперь, для того, чтобы вывести это на экран "Hello World", создадим новый экземпляр класса:
$parent = new parent;

и "запустим" метод print_hello класса parent.
$parent->print_hello();

Вот собственно и вопрос. Как переопределить метод print_hello в дочернем классе, чтобы при вызове $parent->print_hello(); работал переопределенный метод (если конечно такое возможно).
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 3.10.2011, 1:47; Ответить: alexdrob
Сообщение #2


[PHP]<?php

header('Content-type: text/plain;');

class A
{
function p()
{
echo "Метод p из А\r\n";
}

function f()
{
echo "Метод f из А\r\n";
}
}

class B extends A
{
function p()
{
echo "Метод p из B\r\n";
}

function f()
{
parent::f();
echo "Метод f из B\r\n";
}
}

$a = new A;
$b = new B;

$a->p();
$b->p();

$b->f();[/PHP]

Думаю такого кода хватит что бы немного разобраться
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
PRStudio
PRStudio
Topic Starter сообщение 3.10.2011, 17:28; Ответить: PRStudio
Сообщение #3


Спасибо alexdrob, но проблема в том, что теперь при вызове метода f(); класса B вызывается старый метод f(); и новый из B. Я пытался сделать так, чтобы при вызове метода f() класса B старый метод из класса A перезаписывался и действия бы перехватывал класс B. Т.е. например:
[PHP]class A
{
function hello(){
echo "Hello A";
}
}

class B extends A
{
function hello(){
echo "Hello B";
}
}

$A = new A;
$B = new B;

$A->hello();
$B->hello();[/PHP]

Т.я. нужно (если конечно такое возможно), чтобы $B->hello(); "перехватил" родительский метод и перезаписал его, чтобы на экране мы увидели только "Hello B".
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
PRStudio
PRStudio
Topic Starter сообщение 3.10.2011, 17:52; Ответить: PRStudio
Сообщение #4


Нашел решение - использование суперклассов.
[PHP]class A
{
function hello(){
echo "Hello A";
}
}

class B extends A
{
function hello(){
echo "Hello B";
}
}

$a = new A;
$a = new B;

$a->hello(); // Выведет hello B - т.е. то, чего я и добивался :)[/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 3.10.2011, 18:04; Ответить: alexdrob
Сообщение #5


(PRStudio @ 3.10.2011, 20:28) *
но проблема в том, что теперь при вызове метода f(); класса B вызывается старый метод f(); и новый из

ну как бы я это и показал, специально, как вызвать родителя метод на примере f()
а то что вы хотите это метод p()
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
сообщение 4.10.2011, 23:48; Ответить: Arks
Сообщение #6


[PHP]$a = new A;$a = new B; $a->hello(); // Выведет hello B - т.е. то, чего я и добивался :)[/PHP]
1) присвоить области памяти "а" ссылку на область памяти, в которой содержится новый экземпляр класса "А", обеспечить удаление из памяти места, занимаемого экземпляром класса "А" когда область памяти "а" будет удалена(получит флаг на освобождение)
2) присвоить области памяти "a" ссылку на область памяти, в которой содержится новый экземпляр класса "В", обеспечить удаление из памяти места, занимаемого экземпляром класса "B" когда область памяти "а" будет удалена
3) вызвать из области памяти "a"(ссылающуюся в текущий момент на область памяти, содержащую экземпляр класса "B") какие-то действия c памятью, в которой содержится экземпляр класса "B"

Если не секрет, чего ж Вы этим добивались? Ненужной работы скрипта/расхода памяти? Если внимательно посмотрите, увидете - что область памяти, занимаемая классом "A" в Вашем скрипте будет "висеть" до завершения процесса, т.к. ссылка "а" на нее не была физически уничтожена в памяти, но ссылается уже на другое место - "B".
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 5.10.2011, 0:57; Ответить: alexdrob
Сообщение #7


(Arks @ 5.10.2011, 02:48) *
присвоить области памяти "а" ссылку на область памяти

Ну и завернул :D

(Arks @ 5.10.2011, 02:48) *
Если не секрет, чего ж Вы этим добивались?

Я думаю это не его реальный код, а просто небольшой пример.


(Arks @ 5.10.2011, 02:48) *
область памяти, занимаемая классом "A" в Вашем скрипте будет "висеть" до завершения процесса, т.к. ссылка "а" на нее не была физически уничтожена в памяти

Не знал о такой особенности пхп, что если переменной присвоить другое значение, ссылка на предыдущие значение не удалится.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
сообщение 5.10.2011, 2:55; Ответить: Arks
Сообщение #8


Все удаляется только когда не используется, а значит когда нет других ссылок на данную область памяти. В остальном любая переменная висит до завершения процесса или пока не будет перезаписана.
В php $a=1; $a=2 - одно и то же $a с точки зрения php, с точки зрения процессора - разные вещи. Переопределяется ссылка на прееменную содержащую значение $a. При этом используются совершенно разные по "свободности" регистры, и записываются они в совершенно разные области памяти. Т.е. предыдущее значение $a=1(в памяти соотвествующее "1" в формате этой памяти бинарного кода и прочей фигни); не будет очищено в памяти при $a=2.Будет сделана область "2" и значение области "$a" будет установлено сслыкой на ячейку "2".
Что сделает сборщик? Ага, есть у нас "1", на него ссылается "a" - удалять нельзя... хотя фактически "a" уже ссылкается на "2"
Только периодически ненужные чистятся, лучше или хуже. Отсюда все эти утечки. В новых вериях уже научисилсь сличать все три области памяти "а" "А" и "B" чтобы "a" вело именно в нужное место а если до этого "а" вело в "А" а потом "а" установили в "B" то "A" помечалось флагом на удаление
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 5.10.2011, 3:11; Ответить: alexdrob
Сообщение #9


(Arks @ 5.10.2011, 05:55) *
Ага, есть у нас "1", на него ссылается "a" - удалять нельзя

Так как же А на него ссылается, если а не ссылается на него уже)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 5.10.2011, 3:22; Ответить: alexdrob
Сообщение #10


Ну вот, написал простенький скрипт
[PHP]<?php

header('Content-type: text/plain;');

echo memory_get_usage() . "\n";

$a = str_repeat("a", 1000);

echo memory_get_usage() . "\n";

$a = 2;

echo memory_get_usage() . "\n";
[/PHP]

результат
332888
333960
332944

То есть, сразу у нас памяти израсходовано 33288
После присвоения переменной а повтора буквы ааааа.... стало 333960
После присвоения переменной другого значения, размер занимаемой памяти уменьшился (332944) , а по вашим рассуждения он должен был вырасти.
Следовательно не будет тут утечки памяти.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


 



RSS Текстовая версия Сейчас: 25.4.2024, 13:39
Дизайн