PHP - 检查是否可以获得属性

我有一个应用程序,遇到了一个小问题。我有一个类标题:


class ReportArtGroup extends JournalListElement {


    public $artGroupNum;

    private $artGroupAmnt;

    private $accDesc;


    function setArtGroupAmnt($artGroupAmnt) {

        $this->artGroupAmnt = MoneyHelper::centsToDollars($artGroupAmnt);

    }


    function getArtGroupAmnt() {

        return $this->artGroupAmnt;

    }


}

这只是一个示例类。现在假设我想通过一个函数来检查每个属性的可访问性,例如accessible()。特别是可访问的应按以下方式操作:


accessible($reportArtGroup->artGroupNum) // return true.

accessible($report->artGroupAmnt) // should return true because accessible through getter

accessible($report->accDesc) // Should return false because not accessible

我怎样才能在 PHP 中做到这一点?

问题说明:

  1. 使用反射,getProperties()我可以选择仅获取私有属性或仅获取公共属性。直到现在还找不到将 $artGroupAmnt 归还给公众的方法!

  2. 考虑使用isset()但当然在公共属性中设置 isset 取决于是否设置了属性。

任何可以获取对象可以返回的所有属性的方法(包括神奇地使用 getter)都是完美的。也打开以使用反射或任何方法获取所有属性,然后逐一检查。上面提到的行为虽然是小鬼


BIG阳
浏览 131回答 3
3回答

阿波罗的战车

您需要通过 Method 调用访问 getter,因为没有像 C# 那样真正的(保护)属性支持。(随 php 7.4 一起提供)accessible($report->getArtGroupAmnt());如果成员变量是公共的,您可以直接访问它们。public $accDesc;echo $instance->accDesc;要在未设置时具有特殊的返回值,请像这样初始化它们public $iAmTrue = true;public $iAmNull = null;public $iAmNullToo;public $iAmZero = 0;public $iAmEmptyString = '';public $iAmEmptyArray = [];所以在访问时var_dump($instance->$iAmEmptyArray);你会得到一个空数组。因为它们是公开的,所以考虑它可以被覆盖$instance->iAmEmptyArray = 'Hello World';所以你应该编写可靠的 getter 和 setter。private $array;public setArray($array = []):void {      $this->array = $array;}public getArray(): array {      return $this->array ?? [];}像 PHPStorm 这样的现代 IDE 可以为您自动完成。您可能会使用空合并运算符来欺骗一下。公开成员变量并执行以下操作:public $myArray;public $myInt;public $myBool;public $myString;$_array  = $instance->myArray  ?? [];$_int    = $instance->myInt    ?? 0;$_bool   = $instance->myBool   ?? false;$_string = $instance->myString ?? '';

米脂

试试这个:function isPropertyAccessible($obj,$property){  return array_key_exists($property,get_object_vars($obj));}function isMethodAccessible($obj,$method){  return in_array($method,get_class_methods($obj));}class test{  private $private = 1;  protected $protected = 2;   public $public;  private function funcpriv(){}  public function funcpub(){}}$obj = new test;$results = [];$results[] = isPropertyAccessible($obj,'notexists');$results[] = isPropertyAccessible($obj,'private');$results[] = isPropertyAccessible($obj,'protected');$results[] = isPropertyAccessible($obj,'public');$results2[] = isMethodAccessible($obj,'notexists');$results2[] = isMethodAccessible($obj,'funcpriv');$results2[] = isMethodAccessible($obj,'funcpub');var_dump($results);// array(4) { [0]=> bool(false) [1]=> bool(false) [2]=> bool(false) [3]=> bool(true) }var_dump($results2);// array(3) { [0]=> bool(false) [1]=> bool(false) [2]=> bool(true) }

湖上湖

if(property_exist($object,'propertyName'));检查我们的对象if(property_exist($reportArtGroup,'artGroup'))
打开App,查看更多内容
随时随地看视频慕课网APP