Класс 1 + класс 2 = класс 3

StalkerClasses

Новичок
вместо наследования
PHP:
class My3 extended class My1 {
   __construct(){
      if(услование){
         $this= class My2 // перезатираем методы класса 1 на класс 2
      }
   }
}
надо использовать композицию, ничего нового

PHP:
class MyStrategy {
   private $target;
   public function __construct(M1 $m1, M2 $m2){
      if(услование){
         $this->target = $m2; // используем методы класса 2
      }else {
         $this->target = $m1;
     }
  }
  public funtion __call(...$args) {
      return call_user_function([$this->target,__FUNCTION__],$args)
  }
}
Вот что бы мне хотелось сделать:

PHP:
<?php

class helperBase{
    function ec(){
        return get_class().' / ' .get_called_class() .' / '. get_parent_class(). ' / Hi<br />';
    }
}

echo helperBase::ec();

class_alias ('helperBase','helper2');

echo helper2::ec();
Этот код выведет:
helperBase / helperBase / / Hi
helperBase / helperBase / / Hi

Но мне бы хотелось понять что во втором случае вызов идет через "helper2" и соответственно получить:
helperBase / helperBase / / Hi
helper2 / helper 2/ / Hi
 

StalkerClasses

Новичок
Спс. Сердечко от Буз.
PHP:
<?php

class helperBase{
    function ec(){
        print get_class().' / ' .get_called_class().' / Hi<br />';
    }
}

echo helperBase::ec();

#class_alias ('helperBase','helperBase2');
#eval("class helperBase2 extends helperBase {};");

if(!class_exists('helperBase2')) {
    $code = <<<EOF
        class helperBase2 extends helperBase {
        }
    EOF;
    eval( $code );
}

echo helperBase2::ec();



#$r = new ReflectionClass('helperBase2');
#var_dump($r->getName());

Тадам
helperBase / helperBase / Hi
helperBase / helperBase2 / Hi
 

WMix

герр M:)ller
Партнер клуба
только для тебя, от души оторвал
PHP:
spl_autoload_register(function ($class_name) {
    $file = "/tmp/".$class_name.".php";
    $trait = $class_name."Helper";
    if(trait_exists($trait)){
        if(!file_exists($file)){
            file_put_contents(
                $file,
                "<"."?php class ".$class_name." extends helperBase { use ".$trait."; }"
            );
        }
       
        include $file;
    }
});

class helperBase{}

trait myHelper{
    public static function foo(){
        print get_class().' / ' .get_called_class().'<br />';
    }
}

my::foo();
echo get_parent_class('my');
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
ребята, это в йумор

никогда не писал class_alias - а ведь тема для извращений знатная
 
Последнее редактирование:

Yoskaldyr

"Спамер"
Партнер клуба
никогда не писал class_alias - а ведь тема для извращений знатная
Я насчет извращений с класс алиасом еще пару лет назад писал здесь. Но это именно извращения для всяких коробочных решений и eval в том числе. Но совсем не для того что пытается сделать ТС. Хотя если честно я не уверен что он понимает что он делает.
 

Yoskaldyr

"Спамер"
Партнер клуба
Могу пованговать что он через полгодика столкнется с тем что его костыль не работает, т.к. где-то внезапно сигнатуры методов требуют оригинальные классы, а не его костыль. Он же вместо того чтобы сделать нормально и исправить какую-либо базовую вещь, пытается костылить вокруг, не трогая ее. И не понимает что именно делает и куда это ведет.
Если честно то я с таким кодом даже за ставку 5х не буду работать, т.к. шанс что такой заказчик оплатит такую ставку стремится к нулю. Только потому что если он допустил все это, то он очень и очень экономил на программистах до этого и ему проще продолжать нанимать "индусов", чем платить много за переписывание всего этого гуано. Да даже если заказчик и согласится, то шанс того что он прокинет стремится к 100% по тем же вышеописанным причинам.

P.S. Я исхожу из того что это почасовка, а почасовка это 90% случаев фриланс и разовый заказ.
 

WMix

герр M:)ller
Партнер клуба
он думает классами а не обьектами, но в принципе, пока он это делает себе а не под заказ, пусть извращается как хочет, некоторые люди понимают что хорошо а что плохо только после того как сами попробуют.
 

Yoskaldyr

"Спамер"
Партнер клуба
пока он это делает себе а не под заказ, пусть извращается как хочет
Он же все пишет не для своего пет проекта а какому либо работодателю. А значит большой шанс, что кому-то еще придется работать с этим кодом
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
работодатель - человек взрослый, не стоит защищать несовершеннолетних беременных негров -))

эта теника дает повод предположить, что ТС знаком с объектной моделью JS4 через манкипатчинг
 

Yoskaldyr

"Спамер"
Партнер клуба
@grigori так я и не защищаю. Я это написал насчет того что он все-таки пишет не для себя, а для кого-то.
 

StalkerClasses

Новичок
только для тебя, от души оторвал
PHP:
spl_autoload_register(function ($class_name) {
    $file = "/tmp/".$class_name.".php";
    $trait = $class_name."Helper";
    if(trait_exists($trait)){
        if(!file_exists($file)){
            file_put_contents(
                $file,
                "<"."?php class ".$class_name." extends helperBase { use ".$trait."; }"
            );
        }
      
        include $file;
    }
});

class helperBase{}

trait myHelper{
    public static function foo(){
        print get_class().' / ' .get_called_class().'<br />';
    }
}

my::foo();
echo get_parent_class('my');
В моем случае лучше Eval...
 

Yoskaldyr

"Спамер"
Партнер клуба
Мне кажется что идея вырастить eval-демона была подхвачена не только мной. И похоже выращивание идет успешно :)
 

StalkerClasses

Новичок
нет не знаю, расскажи
Он же не выводит классы подключенные через composer.
Мне приходится делать чтение классов не через "get_declared_classes " а через утилиту композера...,

PHP:
$composer = require $GLOBALS['_SERVER']['DOCUMENT_ROOT'].'/vendor/autoload.php';
            if (false === empty($composer)) {
               $classes = $composer->getClassMap();
            }
 

StalkerClasses

Новичок
Спс. Сердечко от Буз.
PHP:
<?php

class helperBase{
    function ec(){
        print get_class().' / ' .get_called_class().' / Hi<br />';
    }
}

echo helperBase::ec();

#class_alias ('helperBase','helperBase2');
#eval("class helperBase2 extends helperBase {};");

if(!class_exists('helperBase2')) {
    $code = <<<EOF
        class helperBase2 extends helperBase {
        }
    EOF;
    eval( $code );
}

echo helperBase2::ec();



#$r = new ReflectionClass('helperBase2');
#var_dump($r->getName());

Тадам
helperBase / helperBase / Hi
helperBase / helperBase2 / Hi
Сегодня попробовал это реализовать. У меня функция eval вызывается внутри класса. И eval выдает ошибку. Потом не понятно как создать через eval класс с namespace...
 
Сверху