为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
BIG阳 2021-12-24 09:27:08
我有一个应用程序,遇到了一个小问题。我有一个类标题: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 getteraccessible($report->accDesc) // Should return false because not accessible我怎样才能在 PHP 中做到这一点?问题说明:使用反射,getProperties()我可以选择仅获取私有属性或仅获取公共属性。直到现在还找不到将 $artGroupAmnt 归还给公众的方法!考虑使用isset()但当然在公共属性中设置 isset 取决于是否设置了属性。任何可以获取对象可以返回的所有属性的方法(包括神奇地使用 getter)都是完美的。也打开以使用反射或任何方法获取所有属性,然后逐一检查。上面提到的行为虽然是小鬼
查看完整描述

3 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

您需要通过 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 ?? '';


查看完整回答
反对 回复 2021-12-24
?
米脂

TA贡献1836条经验 获得超3个赞

试试这个:


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) }


查看完整回答
反对 回复 2021-12-24
?
湖上湖

TA贡献2003条经验 获得超2个赞

if(property_exist($object,'propertyName'));

检查我们的对象

if(property_exist($reportArtGroup,'artGroup'))


查看完整回答
反对 回复 2021-12-24
  • 3 回答
  • 0 关注
  • 130 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信