0

私は PHP の OOP パラダイム全体にかなり慣れていませんが、今のところとても気に入っています。現在、EventSender クラスを作成しています。このクラスは、いくつかの情報を収集してから、イベントを EventHandler に送信し、イベントをイベントログに書き込みます。

「起動」の部分に来たとき、宣言されたすべての変数が設定されていることを検証するための簡単なソリューションが本当に欲しいと思いました。そうする簡単な方法はありますか、それともPHPの組み込み関数でさえありますか?

また、以下に貼り付けたコードは、これまでの私のクラスの実際のコードなので、他に意見がある場合は、自由に考えを詳しく述べてください:-)

class Event extends Base {

private $eventKey;
private $userID;
private $value;

private function __construct($eventKey){

    $sql = Dbc::getInstance();

    //Set and escape the EVENT_KEY.
    $this->eventKey = $sql->real_escape_string($eventKey);

    $sql->select_db('my_event_db');
    $result = $sql->query('SELECT idx FROM event_types WHERE event_key = $this->$eventKey');

    //Verify that the event key given is correct and usable.
    //If failed throw exception and die.
    if($result->num_rows != 1){

        $err = 'ERROR: Illegal EVENT_KEY sent.';
        throw new Exception($err);

    }

}

public function setUserID($userID) {

    $this->userID = $userID;
    if(is_numeric($this->userID) != TRUE){

        $err = 'ERROR: Value passed as userID is not numeric.';
        throw new Exception($err);

    }

}

public function setValue($value) {

    $this->value = $value;
    //The isJson function comes from a Trait that my Base class uses.
    //The method will also throw a exception if it doesn't pass the test.
    self::isJson($this->value);

}

public function fire () {

    /* Here I want some code that swiftly checks if all declared vars have been set, which makes my method "ready to fire".. */        

}

よろしく、 アンドレ V.

4

3 に答える 3

1

Lajos Veres の回答に基づいて、Trait に追加できるクラスを作成し (この場合は何をしたか)、最初の質問で書いたことを正確に実行しました。誰かが再利用したい場合は、共有したかっただけです:-)

protected function allPropertiesSet($self){

    /*
     * This class is dependent on the ReflectionClass.
     * This class can be called with self::allPropertiesSet(get_class());
     * The class can be called in any class who uses this trait, even if it is inherited. It's function is to validate if all your defined variables are set.
     * It will return true if all variables are set, otherwise it will return false. 
     * Some credit goes to Lajos Veres from Stackoverflow for pointing me in the right direction.
     * Author: André Valentin
     * Created: 30-10-2013
     */

    $class = new $self;
    $reflect = new ReflectionClass($class);

    $props = $reflect->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED | ReflectionProperty::IS_PRIVATE | ReflectionProperty::IS_STATIC);
    $prop_array = array();

    foreach($props AS $prop){

        $var_name = $prop->getName();
        $class_name = $prop->class;

        if($class_name == $self){

            $prop_array[] = $var_name;

        }

    }

    foreach($prop_array AS $value){

        $var_name = $value;

        if(!isset($this->$var_name)){

            return false;

        }

    }

    return true;

}
于 2013-10-30T16:51:33.567 に答える
0

を使用Reflectionすると、クラスのプロパティを一覧表示できます

http://www.php.net/manual/en/reflectionclass.getproperties.php

でもこれはやり過ぎだと思う…

于 2013-10-28T22:32:51.220 に答える
0

健全性のために、 を呼び出す前にインスタンスの状態を管理するルールを明確に定義し、fire()それを別の関数に移動します。だからあなたfire()はなる

function fire() {
    if ($this->validate_state()) {
        /// do whatever
        ...
    } else {
       /// report issues
    }
}

バリデーターは、インプレースである必要があるすべてのものをチェックするだけです。

function validate_state() {
    if ( isset($this->some_property) )
     ....
}

または、状態チェックでデフォルト値が設定されていることを確認するだけの場合は、__constructコンストラクターでこれが行われていることを確認してください。そうすれば、どの値が合理的に定義されることが期待されるかを知ることができます。

于 2013-10-28T22:37:49.127 に答える