12

メソッドによって返されるデータのような関数empty()を作成して操作しようとしています。isset()

私がこれまでに持っているもの:

abstract class FooBase{

  public function __isset($name){
    $getter = 'get'.ucfirst($name);
    if(method_exists($this, $getter))
      return isset($this->$getter()); // not working :(
      // Fatal error: Can't use method return value in write context 
  }

  public function __get($name){
    $getter = 'get'.ucfirst($name);
    if(method_exists($this, $getter))
      return $this->$getter();
  }

  public function __set($name, $value){
    $setter = 'set'.ucfirst($name);
    if(method_exists($this, $setter))
      return $this->$setter($value);
  }

  public function __call($name, $arguments){
    $caller = 'call'.ucfirst($name);
    if(method_exists($this, $caller)) return $this->$caller($arguments);   
  }

}

使用法:

class Foo extends FooBase{
  private $my_stuff;

  public function getStuff(){
    return $this->my_stuff;
  }

  public function setStuff($stuff){
    $this->my_stuff = $stuff;
  }
}


$foo = new Foo();

if(empty($foo->stuff)) echo "empty() works! \n"; else "empty() doesn't work:( \n";
$foo->stuff = 'something';
if(empty($foo->stuff)) echo "empty() doesn't work:( \n"; else "empty() works! \n";

http://codepad.org/QuPNLYXP

次の場合に、空/issetがtrue/falseを返すようにするにはどうすればよいですか。

  • my_stuff上記が設定されていないか、次の場合は空またはゼロの値になりますempty()
  • メソッドが存在しません(とにかく致命的なエラーが発生すると思うので、必要かどうかはわかりません)

4

3 に答える 3

9
public function __isset($name){
    $getter = 'get'.ucfirst($name);
    return method_exists($this, $getter) && !is_null($this->$getter());
}

これは、存在するかどうかをチェック$getter()し (存在しない場合は、プロパティも存在しないと見なされます)、null 以外の値を返します。そのため、 の php マニュアルを読んだNULL後に予想されるように、false が返されますisset()

于 2011-06-05T12:02:53.823 に答える
1

次の行が原因で、コードはエラーを返します。

if(method_exists($this, $getter))
return isset($this->$getter());

次のように置き換えることができます。

if (!method_exists($this), $getter) {
    return false; // method does not exist, assume no property
}
$getter_result = $this->$getter();
return isset($getter_result);

ゲッターが定義されていない場合、またはを返す場合はfalseを返しますNULL。一部のプロパティが設定されているかどうかを判断する方法をよりよく考える必要があることを提案します。

上記のコードは、すべてのプロパティに対してゲッターを作成していることも前提としています。したがって、ゲッターがない場合、プロパティは設定されていないと見なされます。

また、なぜゲッターを使用しているのですか?ここではやり過ぎのようです。

于 2011-06-05T11:28:03.047 に答える