PHP: Приведение классов: (изменить класс у уже обьявленного класса)

Пыхтачок

Новичок
Доброго времени суток.
встала задачка изменить класс у уже обьявленного класса, а именно - понизить в должности :(

PHP:
</php
class ParentClass {
   protected $a = 'a';
   protected $b = 'b';
   public function getA() {return $this->a;}
   public final function getB() {return $this->b;}
}

class ChildClass extends ParentClass {
   protected $b = 'bb';                                   // переопределит переменную родителя
   protected $c = 'c';
   public function getA() {return $this->a . $this->a;}   // переопределит функцию родителя
   public function getC() {return $this->c;}
}

$class = new ChildClass();
$class->getA(); // Выведет aa  (используется переменная родителя и переопределенная функция потомка)
$class->getB(); // Выведет bb  (используется переопределенная переменная потомка и функция родителя)
$class->getC(); // Выведет c   (используется переменная потомка и функция потомка)

// ---------------
// Тут надо привести класс к его родителю (ChildClass)$class = (ParentClass)$class;
// Потеря переменных и определенных функций - это и необходимо...
// ---------------

$class->getA(); // Выведет a   (используется переменная родителя и функция родителя)
$class->getB(); // Выведет bb  (используется переменная родителя, но со значением потомка - мы же привели ее и функция родителя)
$class->getC(); // Error       (Ну тут ничего не должно использоваться - в родителе ни класса ни переменной нету - они не нужны...)

?>
Ну вот вроде собсвенно это мне и надо...
сериализация - не вариант - в переменных могут быть другие ресурсы и ссылки на другие уже определенные классы....

надеюсь я подробно описал свою хотелку.
может кто подскажет способы такой реализации - либо что такое точно не возможно....

____
З.Ы.
мысли в слух:
возможно создание final - функции в базовом классе которая к примеру себя порежет и вернет...
главное чтобы не было публичного метода десериализации класса, приватного - пожалуйста.
тока публичный метод - $class->downgrade :)
 

DIG

Новичок
Партнер клуба
$class = new ChildClass();
$class->getA(); // Выведет aa (используется переменная родителя и переопределенная функция потомка)
$class->getB(); // Выведет bb (используется переопределенная переменная потомка и функция родителя)
$class->getC(); // Выведет c (используется переменная потомка и функция потомка)
И что мешает написать здесь:
$class1 = new ParentClass();
И далее по тексту:
$class1->getA();
...

Или я вопрос не понял.
 

Пыхтачок

Новичок
тогда все "сквозные" переменные класа переопределятся
PHP:
$class->getB(); // Выведет b а не bb !!!
 

DIG

Новичок
Партнер клуба
Ну тогда я не понимаю вашей задачи. Что мешает использовать в одном месте parentClass, а где нужно - childClass ?
 

WMix

герр M:)ller
Партнер клуба
PHP:
class ParentClass  {
//...
public final function setB($b) { $this=$b;}
}
$class = new ChildClass();
$class->setB('bb');
$class->getB();
не путай обьекты и классы 'b' не существует
 

Пыхтачок

Новичок
PHP:
class ParentClass  {
//...
public final function setB($b) { $this=$b;}
}
$class = new ChildClass();
$class->setB('bb');
прошу прощения, но я писал, что
в переменных могут быть другие ресурсы и ссылки на другие уже определенные классы....

это не строковая переменная а ресурс, (открытое соединение - поток,)
к которому НЕТ (и не должно быть доступа извне...)
и нужно чтобы получившийся класс - его сохранил - не передавая его внешними методами "public"

нужно либо преобразовать его, либо сделать так чтобы после выполнения он вернул свою уменьшенную копию ), чтобы его задеструктить потом...
 

WMix

герр M:)ller
Партнер клуба
к которому НЕТ (и не должно быть доступа извне...)
передавай через конструктор. создавай через init(), определи $b как private чтоб не переопределяли, как угодно

но внутри обьекта создавать другой обьект, тебе раком выйдет, как тестить захочешь
 
Последнее редактирование:

Adelf

Administrator
Команда форума
@Пыхтачок, какое-то неправильное использование ООП. Сам себя перехитрить хочешь. Рассказывай чего хочешь добиться в глобальном плане. Может чем и поможем.
 

Пыхтачок

Новичок
@Пыхтачок, какое-то неправильное использование ООП. Сам себя перехитрить хочешь. Рассказывай чего хочешь добиться в глобальном плане. Может чем и поможем.
в глобальном есть дерево класов с зависимостями и надо одной функцией - методом понизить класс....
чтобы не вдаваться в логику сильно :
есть нечто вроде:
PHP:
abstract class base {}
class ZZZ extends base {} //олицетворяет просто данные работы уже отключенным всем кроме коннектора к родителю...
class YYY extends ZZZ {} // олицетворяет отключенного клиента но с подключенными коннекторами к БД и другим сокетам
class XXX extends YYY {} // Олицетворяет подключенного клиента
подключается клент - созадется класс XXX extend YYY в который передаются линки на коннектор к клиенту по сокету, коннектор к "бд" по сокету (другой процесс пыхи.. у которого есть реальный коннектор)
после отключения клиента - класс ХХХ должен превратиться в YYY extend ZZZ - сессия ушла в оффлайн - но продолжает выполняться ...
после какого то времени YYY уже превращается в ZZZ extend base который уже потом сериализуется и передается к примеру в бд....
но непосредственно сама конвертация должна проходить так как в коде идет проверка вида
PHP:
 if (!($con instanceof XXX) && $con instanceof YYY)
гдето есть $sessions = array (XXX,YYY,ZZZ,XXX )
суть в том что создаться туда может не только XXX как таковой - а и YYY без подрубленного клиента - как виртуальное соединение...
 

AnrDaemon

Продвинутый новичок
в глобальном есть дерево класов с зависимостями и надо одной функцией - методом понизить класс....
Тебя спрашивают, что тебе НАДО сделать, а ты повторяешь, что ты ХОЧЕШЬ сделать.
"Кто про что, а вшивый всё про баньку" - это про вас.
 

Пыхтачок

Новичок
Тебя спрашивают, что тебе НАДО сделать, а ты повторяешь, что ты ХОЧЕШЬ сделать.
"Кто про что, а вшивый всё про баньку" - это про вас.
для начала, я никого не оскорблял. - это раз
два - реализация была, я её немного обработал и исправил, используя дырку в безопасности пыхи 5.6... (доступа к приватным переменным извне).... не факт что это будет работать потом с новыми версиями пыхи... (в планах на 7-ю пересжать через годик-два)
Я спросил возможные варианты решения - и возможно ли это вообще - а не нравоучений в свой адрес...
Если вам по существу нечего написать - а только пытаться "троллить" людей, которые просят совета... Мне жаль вас....
Ладно, думаю тему можно закрывать - все равно, думаю, тут никто по существу не ответит... зря только время потратил....

Реализация проекта не моя, гавнокода много, я только дописываю функционал в уже работающую платформу и немного оптимизирую код...
Переписывать весь код, как мне тут "советуют" - у меня не хватит никакого времени, да и желания это делать нету. Слишком большой объём работы...
 

fixxxer

К.О.
Партнер клуба
Любое решение будет кривое: у тебя используется наследование там, где следовало использовать композицию.

Если уж так вышло, и исправить просто не выйдет - то меньшим из зол будет сделать по иерархии какие-то такие методы:

PHP:
class A {
      public function getA():A { return $this; }
}
class B extends A {
     public function getA():A {
          $a = new A();
          $a->foo = $this->foo;
          $a->bar = $this->bar;
          return $a;
     }
     public function getB():B { return $this; }
}
class C extends B {
     public function getB():B {
          // по аналогии с B::getA()
     }
}
 

AmdY

Пью пиво
Команда форума
Есть подожрение что ему нужен parent или статик методы.
PHP:
public function getA() {
    if ($this->downgarde) return parent::getA();
   return $this->a . $this->a;
}
только у тебя каша в голове с обеъктами и классами, уже представляю как ты "отимизируешь" код с таким подходом.
 

Redjik

Джедай-мастер
уже представляю как ты "отимизируешь" код с таким подходом
и с такой терминологией
мне вот интересно что автор хочет, но я два раза все перечитал и так и не понял
понизить в должности
функции в базовом классе которая к примеру себя порежет и вернет...
после выполнения он вернул свою уменьшенную копию
используя дырку в безопасности пыхи 5.6... (доступа к приватным переменным извне)
есть дерево класов с зависимостями и надо одной функцией - методом понизить класс....
олицетворяет просто данные работы уже отключенным всем кроме коннектора к родителю...
коннектор к "бд" по сокету (другой процесс пыхи.. у которого есть реальный коннектор)
класс ХХХ должен превратиться в YYY extend ZZZ - сессия ушла в оффлайн - но продолжает выполняться ...
 

WMix

герр M:)ller
Партнер клуба

Redjik

Джедай-мастер
PHP:
class Foo
{
    protected $b = 'b';
}

class Bar extends Foo
{
    public static function createFromFoo(Foo $foo)
    {
        $bar = new static();
        $bar->b = $foo->b.'b';
        return $bar;
    }
}
??
 

Redjik

Джедай-мастер
Он вроде наоборот хочет.
ну еще раз перечитал, ощущение, что чувак хочет срезку как на плюсах сделать, но так как он этого на плюсах не делал (иначе бы владел терминологией), то не думаю что у него получится это сделать на пыхе =)

тем более это считается хаком.
тем более есть Interface Segregation Principle (буковка I в SOLID), как раз для того, чтобы срезку не делать
 

fixxxer

К.О.
Партнер клуба
Да. У него уже буковка I явно нарушена унаследованным кодом (да и S явно тоже), а делать что-то надо.

Методы типа getB() и интерфейсы типа BProviderInterface -> BInterface видятся мне наименьшим злом, если рефакторить нет возможности.
 
Сверху