首页 > 解决方案 > 在特征中查找类属性,但仅查找类的属性

问题描述

我试图隔离源自class包含 的属性的属性trait。IE应该创建一个包含所有属性名称的trait数组,class不是在.traittrait

我曾尝试过extending上课。我尝试过使用PHP 中的static方法:是否可以从 trait 静态方法中使用 trait 获取类的名称?我无处可去。

我将在 中使用已知属性,trait并简单地将它们从属性数组中删除(因为我知道它们的名称)。这是一个相当丑陋的解决方案,但它会起作用。

有人看到更好的方法吗?

trait FooTrait
{
  public $classVariables;

  public function classAttributes()
  {
    $callingClass = get_class($this);
    $rawAttributes= $this->$classVariables = get_class_vars($callingClass);
    var_dump($rawAttributes);
    var_dump($callingClass);
    return $rawAttributes;
  }

  public function info()
  {
    var_dump($this->classVariables);
  }

  // manipulate $this -> classVaribales to do generic database operations

}

class Mine
{
  use FooTrait;
  protected $attrib1;
  protected $attrib2;
  protected $attrib3;
}

$needed = new Mine;

$needed->classAttributes();
$needed->info();

OUTPUT 是属性 1,2,3 和 bar。如何获得属性 1、2、3?

编辑:我编辑了几个属性以尝试使其更易于理解。

标签: phpattributestraits

解决方案


trait更新:如果属性是protectedor ,这不起作用private。由于不应直接引用特征......有点破坏交易。

我能找到获得trait没有调用属性的唯一方法class是将其命名为文字。但是限制了scopeand 所以看不到privateandprotected属性。

我现在放弃了,将使用trait. 不是一个大问题,只是非常不雅。

class ThisClass {
use ThisTrait;
public $classAttribute1 = 3;
public $classAttribute2 = 3;
public $classAttribute3 = 3;
}

trait ThisTrait {
  public $traitTrait1 = 3;
  public $traitTrait2 = 3;
  public $traitTrait3 = 3;

  public function classAttributes (){
    $traitAttributes = get_class_vars("ThisTrait"); //NB String not variable
    $traitAttributes = array_keys ($traitAttributes);
    $className = get_class($this); //NB Var = gets class where this called
    $classAttributes = get_class_vars($className);
    $classAttributes = array_keys($classAttributes);

    $classOnly = array_diff($classAttributes, $traitAttributes);
    return $classOnly;
  }
}

$thisClass = new ThisClass ();
$result = $thisClass -> classAttributes();
var_dump($result);

=========================================
array (size=3)
0 => string 'classAttribute1' (length=15)
1 => string 'classAttribute2' (length=15)
2 => string 'classAttribute3' (length=15)

推荐阅读