lyxsus
Новичок
Имитация наследования нескольких классов
вот такой код работает. и даже иногда удобен, но есть 2 вопроса. сразу скажу, что предложения с eval уже были.
1) сейчас можно имиторвать наследование только public. это проблема.
2) используется 2 eval'а. а это уже плохо.
если не сложно, присоветуйте чего.
-~{}~ 13.04.05 13:59:
поправка. в "__call", там, где параметры генеряться надо заменить фуыч на
вот такой код работает. и даже иногда удобен, но есть 2 вопроса. сразу скажу, что предложения с eval уже были.
1) сейчас можно имиторвать наследование только public. это проблема.
2) используется 2 eval'а. а это уже плохо.
если не сложно, присоветуйте чего.
PHP:
<?
abstract class to_import { //1й класс для импорта
public $somevar = "sv";
public function fk($p1, $p2) {
echo "Imported function called with args p1 = $p1; p2 = $p2<br/>\r\n";
}
};
abstract class lex { //2й класс для импорта
public $nick = "Lyxsus";
public function wau() {
echo "My name is \"" . $this->nick . "\"!\r\n<br/>";
}
}
class base { //базовый класс
protected $__classes = Array();
public function __call($a, $b) { //отсутствующие методы ищем в подгруженных классах
foreach($this->__classes as $class_name) { //листинг классов
$cm = get_class_methods($class_name);
if(in_array($a, $cm)) { //ищем, нету ли в классе нужного метода
$params = "";
if(is_array($b)) { //генерим строчку с парамами
foreach($b as $param) {
$params .= $param . ",";
}
$params = substr($params, 0, strlen($params) - 1);
}
eval('return ' . $class_name . '::' . $a . '(' . $params . ');'); //от eval'а хотелось бы избавиться
}
}
}
protected function __implement($class_name) { //подключение класса
$this->__classes[sizeof($this->__classes)] = $class_name; //имя класса запоминаем
//дописываем переменные
$vars = get_class_vars($class_name);
foreach($vars as $var => $val) {
eval('$this->' . $var . ' = \'' . $val . '\';'); //и от этого eval'а тоже.
}
}
};
class go extends base {
function __construct() {
$this->__implement("to_import");
$this->__implement("lex");
}
function t() {
$this->fk(4, 6);
echo "Own function.<br/>\r\n";
}
};
//тестим
$g = new go;
$g->fk(2, 4);
$g->t();
$g->wau();
$g->nick = "Nick";
$g->wau();
?>
поправка. в "__call", там, где параметры генеряться надо заменить фуыч на
PHP:
for($i = 0; $i < sizeof($b); $i++) {
$param = $b[$i];
$params .= '&$b[' . $i . ']';
if($i != sizeof($b)-1)
$params .= ", ";
}