如何获取公共类属性(不是继承的属性)

时间:2019-01-04 16:57:52

标签: php laravel

有什么方法只能获取Mailable类中的公共类属性(而不是继承的属性),例如:

<?php

namespace App\Mail;

use App\Mail\Mailable;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class TestMail1 extends Mailable implements ShouldQueue
{

    use Queueable, SerializesModels;

    public $name; // i want to get only this

    public $body; // and this

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Build the message.
     *
     * @return $this
     */ 
    public function build()
    {
        return $this->view('emails.simpleview')->subject('New Mail');
    }
}

该类(TestMail1)继承了扩展类(Mailable)的许多属性,但是我只想获取该类本身已被拒绝的namebody属性

我试试这个:

$mailable = (new mailable1);

$data = new ReflectionClass($mailable);

$properties = $data->getProperties(ReflectionProperty::IS_PUBLIC);

$properties_in = [];

foreach ($properties as $prop) {
    if ($prop->class == $data->getName())
     $properties_in[] = $prop->name;
}

dd($properties_in);

但这返回:

array:8 [▼
      0 => "name"
      1 => "body"
      2 => "connection"
      3 => "queue"
      4 => "chainConnection"
      5 => "chainQueue"
      6 => "delay"
      7 => "chained"
    ]

有解决方案吗?

2 个答案:

答案 0 :(得分:3)

显示的属性不是继承的,它们是<特性>特质中的

如果看一个简单的例子,您会发现其中的区别:

trait T {
    public $pasted;
}

class A {
    public $foo;
}

class B extends A {
    use T;

    public $bar;
}

$data = new ReflectionClass(B::class);
$properties = $data->getProperties(ReflectionProperty::IS_PUBLIC);
$properties_in = [];
foreach ($properties as $prop) {
    if ($prop->class == $data->getName()) {
        $properties_in[] = $prop->name;
    }
}
print_r($properties_in);

这显示了$bar类的B和特征$pasted的{​​{1}},但没有显示T类的$foo

以同样的方式,您的输出不会显示A类的字段,而是显示Mailable语句导入的两个特征的字段

这是按照设计的方式进行的:一个特征被视为“编译时复制和粘贴”,因此该特征中包含的成员与直接在该类中定义的成员没有区别。

答案 1 :(得分:0)

您可以尝试以下操作:

data[1,1,1]