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
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();
Спс. Сердечко от Буз.Забудь!
<?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());
только для тебя, от души оторвалТадам
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');
а кто виноват, что в php есть eval? мы-то его, конечно знаемМожет пора очистить наш банхаммер от паутины?
Я насчет извращений с класс алиасом еще пару лет назад писал здесь. Но это именно извращения для всяких коробочных решений и eval в том числе. Но совсем не для того что пытается сделать ТС. Хотя если честно я не уверен что он понимает что он делает.никогда не писал class_alias - а ведь тема для извращений знатная
Он же все пишет не для своего пет проекта а какому либо работодателю. А значит большой шанс, что кому-то еще придется работать с этим кодомпока он это делает себе а не под заказ, пусть извращается как хочет
В моем случае лучше Eval...только для тебя, от души оторвал
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');
И раз уж тронули функцию "spl_autoload_register".В моем случае лучше Eval...
нет не знаю, расскажиЭто не выводит все - сами знаете
Он же не выводит классы подключенные через composer.нет не знаю, расскажи
$composer = require $GLOBALS['_SERVER']['DOCUMENT_ROOT'].'/vendor/autoload.php';
if (false === empty($composer)) {
$classes = $composer->getClassMap();
}
Сегодня попробовал это реализовать. У меня функция eval вызывается внутри класса. И eval выдает ошибку. Потом не понятно как создать через eval класс с namespace...Спс. Сердечко от Буз.
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