PHP5 и множественное наследование

Benvolio

Guest
PHP5 и множественное наследование

Здравствуйте, коллеги!

Насколько я понял ситуацию, в PHP5 не будет поддержки множественного наследования, а будет т.н. "поддержка"-эмуляция множественного наследования через интерфейсы a la Java. Я не знаток Java, я в качестве "альтернативного" языка предпочитаю Perl и его "демократичную" объектную модель.
Можете вкратце, но метко рассказать, как с помощью интерфейсов эмулировать двойное наследование? Или по крайней мере пояснить, что имелось ввиду в июньском номере PHP Inside?

Премного благодарен!
 

Vasya

Guest
В яве все просто...
class Target extends SuperClass implements Intrface1, Intrface2 {
}

Полученый Target будет обладать свойствами и SuperClass, и Intrface1, и Intrface2. И Target instanceof ???
для всех трех тоже будет истиной.
 

Benvolio

Guest
И что, такая же самая схема прокатит и с PHP5?
 

Vasya

Guest
PHP:
<html><body><pre><?
show_source($_SERVER["SCRIPT_FILENAME"]);
$v = phpversion();
print "\n---END OF FILE---\n\nphpversion() is " . $v ."\n\n";
if(version_compare($v, "5.0.0","<")) {
	print "PHP version should be >=5.0.0";
	exit();
}

class BaseClass {
	function base() {
		echo "BaseClass::base() invoked.\n";
	}
	public function common() {
		echo "BaseClass::common() invoked.\n";
	}
}

interface Inter1 {
	public function common(); // no body here
	public function barklay(); // no body here
}

interface Inter2 {
/*
Don't declare common() function here,
because it overlaps the same function of Inter1 in CTarget
and generates fatal error.
What the reason of the restriction?..

	public function common();
*/
	public function dzink(); // no body here
}

class CTarget extends BaseClass implements Inter1, Inter2 {
	public function barklay() {
		echo "Inter1::barklay() implemented.\n";
	}
	public function dzink() {
		echo "Inter2::dzink() implemented.\n";
	}
	public function common() {
		echo "It's a common() function for both - class & interface.\n";
	}
	public function bool2str($b) {
		return $b ? 'yep' : 'nop';
	}
}

$o = new CTarget();

$o->base();
$o->barklay();
$o->dzink();
$o->common();

print "---\n";
print "Is \$o an instance of BaseClass? <b>".
	$o->bool2str($o instanceof BaseClass)."</b>\n";
print "Is \$o an instance of Inter1? <b>".
	$o->bool2str($o instanceof Inter1)."</b>\n";
print "Is \$o an instance of Inter2? <b>".
	$o->bool2str($o instanceof Inter2)."</b>\n";

?></pre></body></html>
Выводит примерно следующее:
Код:
phpversion() is 5.0.0

BaseClass::base() invoked.
Inter1::barklay() implemented.
Inter2::dzink() implemented.
It's a common() function for both - class & interface.
---
Is $o an instance of BaseClass? yep
Is $o an instance of Inter1? yep
Is $o an instance of Inter2? yep
 
Сверху