2016-04-12 33 views
0

PhPには型キャストのようなものはありませんが、試してみることができます。Php、タイプキャスト(ダウンキャスト)(拡張クラスを取り除く)

class Entity extends Base 
{ 
    private $name; 

    public function getName() 
    { 
     return $this->name; 
    } 

    public function setName($v) 
    { 
     $this->name = $v; 
    } 
} 

and its Base 

abstract class Base 
{ 
    public function save() 
    { 
    } 
} 

は今エンティティがある:私は実体を持って

$e = new Entity(); 

と私はそれをメソッドに渡すことができます:

$this->callMe($e); 

private function callMe (Entity $e) 
{ 
    $e->getName(); // OK! 
    $e->save(); // !!!!!!!!!!!! I DONT WANT IT 
} 

問題がある、私は渡したいですEntity自身を削除し、継承されたプロパティをスキップします。他のルーチンを誰かに混乱させたくないからです。言い換えれば

// problem is too many parameters and not tight coupled enough 
$this->callMe($e->getName(), $e->getWhatever()); 

または

// then no longer type hinting, just a "bag" array 
$this->callMe($e->toArray()); 

が、私はクラスを継承し を取り除きたい:もちろん、私のような何かを行うことができます。

+1

継承を望まない場合は継承しないでください。代わりに合成を使用してください。 PS:私はあなたが "ダウンキャスト"を望んでいないと言います – zerkms

答えて

1

継承されたメソッドにアクセス権を与えたくない場合は、それらをプライベートにするか、基本クラスで保護するだけです。

+0

そして、それが完了したシステムならば、例えばDoctrine? –

3

@zerkmsが言ったように、あなたがそれを望まないなら、それをしないでください。あなたは、この出力で表示されますよう

あなたには、いくつかの奇妙なユースケースを持っている場合は、ここで反射http://php.net/manual/en/reflectionclass.getmethods.php

を使用することを検討しては、いくつかの例では、

<?php 

class Entity extends Base 
{ 
    private $name; 

    public function getName() 
    { 
     return $this->name; 
    } 

    public function setName($v) 
    { 
     $this->name = $v; 
    } 
} 

abstract class Base 
{ 
    public function save() 
    { 
    } 
} 

$test = new Entity(); 

$reflectionClass = new ReflectionClass($test); 
$methods = $reflectionClass->getMethods(); 
var_dump($methods); 

$methods変数は、$class参照を持つことになります。これを使用してクラスEntityのメソッドだけを呼び出します。