3

プロパティのセットを含むクラスを作成しようとしています。次のように使用されます。

$class = new test_class();

$class->property;
$class->second_property;

基本的に、プロパティが存在する場合は true、存在しない場合は false です。プロパティには値がなく、存在のみがあります。

今、私はこのようなことをしたい:

$class = new test_class();

var_dump($class->property); // false - property does not exist
var_dump($class->second_property); // true - second_property exists

var_dump( (bool) $class); // true

したがって、テスト クラスのプロパティが 1 つでも存在する場合$class、オブジェクトであるため、var ダンプは true を表示します。

ただし、クラスにプロパティがない状況では、これを実現したいと考えています。

$class = new test_class();

var_dump($class->property); // false - property does not exist
var_dump($class->second_property); // false - second_property does not exist

var_dump( (bool) $class); // false

しかし、私はまだなりたいのです$classが、ロジックテストで false を返します。instanceoftest_class

これはまったく可能ですか?もしそうなら、どうすればいいですか?

ありがとう、オジー

編集:

明確にするために、私はすでに __get() マジック関数を使用しています。私がしたいのtest_classは、 にプロパティがない場合、 avar_dumpが実行されると false を返しますが、instanceofは を返しtest_classます。

精査中...

複雑な権限システムを作成しています。ユーザーにはセクションが割り当てられ、各セクションには一連の権限があります。

次のように機能します。

$user = permissions::get_user(USER_ID_HERE);
// Every property of the $user is a section

var_dump($user->this_section_exists); // true - returns an object
var_dump($user->this_section_doesnt); // false - returns a boolean

セクションが存在する場合、セクション権限のオブジェクトを返します。

var_dump($user->this_section_exists); // true
var_dump($user->this_section_exists->this_permission_exists); // true

var_dump($user->this_section_exists->this_permission_doesnt); // false

エッジケースは次のとおりです。

var_dump($user->this_section_doesnt); // false

var_dump($user->this_section_doesnt->some_permission);
// This should also return false, which it does,
// But it throws a notice: "Trying to get property of non-object"

クラスを呼び出すコードを変更せずにその通知を抑制できるようにしたい、つまり @ を抑制しない.. または、ロジックテストで false と評価されるプロパティのないオブジェクトを返すことができるようにしたい.

4

5 に答える 5

1

私がやりたいことは、test_class にプロパティがない場合、var_dump が実行されると false を返しますが、instanceof は test_class を返します。

それは不可能var_dumpです。常に正しいタイプが表示されます。それがそのために作成されたものです。

于 2013-01-25T12:37:45.250 に答える
0

いいえ、あなたが書いたとおりにそれを行うことはできません。ただし、同様のものをエミュレートできます。

class A {

    public function __toString() { // this is what you want, but it only works when you use your object as a string, not as a bool.
        if (count(get_class_vars(__CLASS__))) { // so if the class has at least 1 attribute, it will return 1.
            return '1';
        } else {
            return '0';
        }
    }
}

$a = new A;
var_dump((bool)(string)$a); // false

A クラスにプロパティを追加すると、true が返されます。なしでも使用できます(bool)

if ((string)$a) {
    echo 'I am not empty';
} else {
    echo 'I am an empty object';
}

を使用したくない場合(string)は、コードを含むメソッドを作成し、__toString()キャストする代わりにそれを呼び出すオプションが 1 つあります。

参考文献:

PS: あなたが言ったことについて -var_dump()オブジェクトに対して a を実行して false を返します。いいえ、それはできません。

于 2013-01-25T12:37:35.227 に答える
-1

答えを操作するために__get()でラッピングを行うことができます。

のようなことを言う

class test_class {

  private $_validProperties;
  public function __construct()
  {
    $this->validProperties = array('foo', 'bar', 'widget');
  }

  public function __get($prop)
  {
    if (isset($this->_validProperties[$prop])
    {
      return true;
    }
    return false;
  }
}

$a = new test_class();
var_dump($a->foo); //true
var_dump($a->tree); //false
于 2013-01-25T12:31:56.357 に答える
-1

あなたのことを正しく理解しているなら、そうするしかありません。

それがあなたを助けることを願っています

<?php
class Permissions {
    private $userPermissions = array(
        1 => array(
            'Blog' => array('Post'),
        ),
    );

    private $permission;

    public function __construct($id) {
        $this->permission = $this->userPermissions[$id];
    }

    public function __get($name) {
        if(isset($this->permission[$name])) {
            return new $name($this->permission[$name]);
        }
        return new Notfound();
    }

}

class Blog {
    private $permission;

    public function __construct($permission) {
        $this->permission = $permission;
    }

    public function __get($name) {
        if(($key = array_search($name, $this->permission)) !== false) {
            return new $name();
        }
        return new Notfound();
    }

    public function __tostring() {
        return true;
    }
}

class Post {
    public function __get($name) {
        return isset($this->$name) ? true : new Notfound();
    }
    public function __tostring() {
        return true;
    }
}

class Notfound {
    public function __get($name) {
        return false;
    }
    public function __tostring() {
        return false;
    }
}

$user = new Permissions(1);
var_dump('Blog ', $user->Blog); // return Blog
var_dump('Blog:Post', $user->Blog->Post); // return Post
var_dump('News', $user->News); // return Notfound
var_dump('News:Post', $user->News->Post); // return false
于 2013-01-25T13:33:42.807 に答える