2016-03-21 5 views
3

プライベートプロパティを含むクラスでは、property_exists()関数はtrue(php> 5.3)を返します。関数にはis_callableのメソッドがあります。メソッドは存在するだけでなく、(method_exists()の代わりに)利用可能でもあります。このプロパティにアクセスできるかどうかを確認する、この関数と同等の機能がありますか?プロパティはPHPでアクセス可能な場合どのように検証しますか?

<?php 

class testClass { 

    private $locked; 

    public $unlocked; 

    private function hiddenFunction(){ 
     return "hidden"; 
    } 

    public function visibleFunction(){ 
     return "visible"; 
    } 

} 

$object = new testClass(); 

var_dump(property_exists($object, "unlocked")); // returns true 
var_dump(property_exists($object, "locked")); // returns true > php 5.3 

var_dump(method_exists($object, "hiddenFunction")); // returns true but can't be called 
var_dump(method_exists($object, "visibleFunction")); // returns true 

var_dump(is_callable(array($object, "hiddenFunction"))); // returns false 
var_dump(is_callable(array($object, "visibleFunction"))); // returns true 

?> 

答えて

0

あなたは、リバースエンジニアクラス、インターフェイス、関数、メソッド、および拡張ようになるReflectionクラスtahtを使用することができます。

例えば、クラスのすべてのパブリックプロパティを取得するには、次のように行うことができます。

$reflectionObject = new ReflectionObject($object); 
$testClassProperties = $reflectionObject->getProperties(ReflectionProperty::IS_PUBLIC); 
print_r ($testClassProperties); 

OUTPUT

Array 
(
    [0] => ReflectionProperty Object 
     (
      [name] => unlocked 
      [class] => testClass 
     ) 

) 

クラスのすべてのパブリックメソッドを取得するには、次のことができ以下のようにしてください:

$reflectionObject = new ReflectionObject($object); 
$testClassProperties = $reflectionObject->getMethods(ReflectionProperty::IS_PUBLIC); 
print_r ($testClassProperties); 

OUTPUT

Array 
(
    [0] => ReflectionMethod Object 
     (
      [name] => visibleFunction 
      [class] => testClass 
     ) 

) 
+0

ありがとう。関数のチェックは簡単なPHP関数で行うことができますが、プロパティではリフレクションクラスを使用する必要があります。 – Joe

0

反射を使用する代わりに、get_class_vars関数を使用できます。この関数は、アクセス可能なプロパティのみを返します。

$vars = get_class_vars(get_class($object)); 

これはすばらしく、私は反射よりも効率的だと確信しています。 おそらく、この関数は動的に作成されたプロパティを気にしないことに注意してください。もう一度。私は誰もそれをやっていないと思います。また、この関数はPHP 5.6で親クラスのパブリックプロパティも返します。古いバージョンでも同じように動作します。しかしそれは他の誰かが確認するまでです:-)

関連する問題