Type Hinting в PHP5

faithless.man

Новичок
Type Hinting в PHP5

PHP:
<?php
interface A {
}
class D  {
}
class B extends D  implements A {
}

class C {
	public function __construct (D $x) {
		print Reflection::export(new ReflectionObject($x)) . "\n";
	}
}
$x = new B;
$c = new C($x);
?>
почему не происходит Fatal Error?
ведь $x экземпляр класса B, а не D.
тоже самое произойдет если в Type Hint подставить интерфейс A.
 

itprog

Cruftsman
faithless.man
Класс B отнаследовал класс D, значит класс B обладает нужным интерфейсом для метода C::__construct().

Кстати, отражение показывает:
Object of class [ class B extends D implements A ]
При этом не важно, к B или D делается implement интерфейса A
 

faithless.man

Новичок
Автор оригинала: itprog
faithless.man
Класс B отнаследовал класс D, значит класс B обладает нужным интерфейсом для метода C::__construct().

Кстати, отражение показывает:
Object of class [ class B extends D implements A ]
т.е. Type Hinting не определяет строгой принадлежности к определенному классу? (интересная особеность)
 

itprog

Cruftsman
faithless.man
а должен ли? Ведь класс B расширил класс D... Интерфейс то нужный вроде остался.
Для чего ты вообще проверяешь к какому классу принадлежит объект?
 

faithless.man

Новичок
Автор оригинала: itprog
faithless.man
Для чего ты вообще проверяешь к какому классу принадлежит объект?
просто стало интересно, в одном из примеров по SPL была такая проверка:
PHP:
<?php
class EvenFilterextends FilterIterator{
	function __construct(Iterator $it) {
		parent::__construct($it); 
	}
	function accept() {
		return$this->current() % 2 ==0; 
	}
}
class MyIteratorimplements Iterator{
	function __construct($ar) {
		$this->ar= $ar; 
	}
	function rewind() {
		reset($this->ar); 
	}
	function valid() {
		return !is_null(key($this->ar)); 
	}
	function current() {
		return current($this->ar); 
	}
	function key() {
		return key($this->ar); 
	}
	function next() {
		next($this->ar); 
	}
}

$a = array(1,2,5,8);
$i= new EvenFilter(new MyIterator($a));
foreach($i as $key => $val) {echo "$key => $val\n";}
?>
здесь тоже Type Hinting Iterator.
просто интересно знать как работает Type Hinting вот и спрашиваю :)
 

Krishna

Продался Java
Кстати, в продолжение темы мне кажется неплохо было бы при переопределении родительского метода в дочернем классе иметь возможность задавать более строгий type hinting

то есть, если
PHP:
class A 
{
 // в классе A задан метод m1 с ограничением параметра на Xclass

 public function m1 (Xclass $var1)
 {
 }

}

class B extends A
{
// то в дочернем классе B можно переопределить m1 как 
 public function m1 (Yclass $var1)
// где Yclass extends Xclass
 {
 }

}
с полезностью этой фичи столкнулся непосредственно
как думаете была бы такая возможность позитивной и что надо сделать чтобы она была реализована?
Как так сказать создать feature request? )
 

tony2001

TeaM PHPClub
>Кстати, в продолжение темы мне кажется неплохо было бы при переопределении
>родительского метода в дочернем классе иметь возможность задавать более строгий
type hinting

==

"иметь возможность делать одноимённые методы родственных классов, но с абсолютно разными интерфейсами", что есть нарушение всей логики - если у классов методы называются одинаково, то и вести себя они должны одинаково.
 

Krishna

Продался Java
Ну вообще, да, полиморфизм прососёт походу в общем случае :(
 
Сверху