あなたはあなたが求めていることを達成するためにリフレクションを使用しなければなりません。
<?php
class MyClass {
private $myProperty = true;
}
$class = new ReflectionClass("MyClass");
$property = $class->getProperty("myProperty");
$property->setAccessible(true);
$obj = new MyClass();
echo $property->getValue($obj); // Works
echo $obj->myProperty; // Doesn't work (error)
?>
参照してください。その場合にはReflectionProperty::setAccessible
のためのPHPマニュアル、おそらくマジックメソッドを使用する必要があります。これらの線に沿って何か。
class Person {
private $properties = [
'first_name' => ['visibility'=>'public','value'=>null]
'last_name' => ['visibility'=>'public','value'=>null],
'income' => ['visibility'=>'private','value'=>null]
];
function __get($name) {
if (array_key_exists($name, $this->properties) && $this->properties[$name]['visibility'] == 'public')
return $this->properties[$name];
}
function __set($name, $value) {
if (array_key_exists($name, $this->properties) && $this->properties[$name]['visibility'] == 'public')
$this->properties[$name] = $value);
}
}
お返事ありがとうございます。明確にするために、名前付きクラスを定義しています(クラス名はSQLビュー名と一致しています)。これらのクラスは私のフレームワークのベースモデルクラスを拡張しているので、データは自動的にオブジェクトに取り込まれ、配列やstdClassオブジェクトなどを扱うことはありません。しかし、私はどのような場合でも、クラスの宣言されていないプロパティのデフォルトの可視性を変更する方法はないと思いますか?1つの保護された配列にすべてのフィールドを格納するのは良いカスタムソリューションですが、私はフレームワークの動作を保持して、各フィールドを別々のオブジェクトプロパティに入れたいと考えています。 – YeB