0 レビュー
2 回答
PHP __getオーバーロードは、オブジェクトではなく配列を返します
これがオブジェクトではなく配列を返すのはなぜですか?また、オブジェクトを返すにはどうすればよいですか?
Class MyClass {
private $filename = '...';
private $_ini_array;
public function __construct() {
// Get the config file data
$ini_array = parse_ini_file( $filename, true );
$this->_ini_array = $ini_array;
}
public function __get( $param ) {
return $this->_ini_array[ $param ];
}
}
呼び出された...
$c = new MyClass();
var_dump( $c->db_pgsql );
返品...
array(6) {
["data"]=>
string(4) "test"
...
そしてキャスト...
return (object) $this->_ini_array;
返品...
object(stdClass)#2 (6) {
["data"]=>
string(4) "test"
...
帰りたい間...
object(MyClass)#2 (6) {
["data"]=>
string(4) "test"
...
ありがとうございました!
更新。解決しました。
私は自分の目標をほぼ達成する次のクラスを書くことになりました。悪い習慣や雑なコードなどを見つけたらコメントしてください。
class Config {
private $config_filename = '../include/config.ini';
public function __construct( array $array=null ){
if ( $array ) {
foreach ( $array as $key => $val ) {
$this->$key = $val;
}
} else {
$ini_array = parse_ini_file( $this->config_filename, true );
foreach( $ini_array as $key => $val ){
$this->$key = new self( $val );
}
}
}
public function __get( $param ) {
return $this->$param;
}
}
これは、私の特定のテスト構成ファイルを使用して、次のようなオブジェクトを生成します...
VarDump: object(Config)#1 (3) {
["config_filename:private"]=>
string(21) "../include/config.ini"
["heading1"]=>
object(Config)#2 (3) {
["config_filename:private"]=>
string(21) "../include/config.ini"
["str1"]=>
string(4) "test"
["str2"]=>
string(5) "test2"
}
["heading2"]=>
object(Config)#3 (2) {
["config_filename:private"]=>
string(21) "../include/config.ini"
["str1"]=>
string(9) "testagain"
}
}
["config_filename:private"]プロパティを再帰的に複製しないほうがよかったと思います。しかし、私はそれを回避する方法を想像することができませんでした。したがって、回避策をご存知の場合は、コメントをいただければ幸いです。
私を正しい方向に導くためのすべての助けに感謝します。
わからない
0
レビュー
答え :
解決策:
これがオブジェクトではなく配列を返すのはなぜですか[...]
$this->_ini_array の設定で表示されるのは、配列 parse_ini_file
の戻り値だけです。 em>(配列の配列)。
オブジェクトを返すにはどうすればよいですか?
関連する配列を繰り返し処理し、オブジェクトに手動でデータを入力する必要があります。
これがオブジェクトではなく配列を返すのはなぜですか[...]
$this->_ini_array の設定で表示されるのは、配列 parse_ini_file
の戻り値だけです。 em>(配列の配列)。
オブジェクトを返すにはどうすればよいですか?
関連する配列を繰り返し処理し、オブジェクトに手動でデータを入力する必要があります。
わからない
0
レビュー
答え :
解決策:
コードによると、iniファイルを解析し、結果の配列の要素を返します。呼び出し元のコードによると、キーとして「db_pgsql」を使用して値が返されることを期待しています。これは文字列になります。
オブジェクトが必要な場合は、オブジェクトをインスタンス化してから返す必要があります。たとえば、次のようになります。
class Bar
{
}
class Foo
{
public function __get($param)
{
return new $param();
}
}
$foo = new Foo();
var_dump($foo->Bar);
わからない
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。