有什么方法只能获取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)的许多属性,但是我只想获取该类本身已被拒绝的name
和body
属性
我试试这个:
$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"
]
有解决方案吗?
答案 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]