0

PHP のオブジェクトについて質問があります。名前を付けるにはどうすればよいですか?

私が次のことをするとき:

$arUserStuff =  array ('name' => 'username', 'email' => 'test@test.com');

$object = (object) $arUserStuff;

print_r($object);

印刷機能は私に次を返します:

stdClass Object ( [name] => username [email] => test@test.com )

たとえば、ユーザーオブジェクトでstdクラスオブジェクトを変更するにはどうすればよいですか?

本当に調べられない!

ありがとう!

4

4 に答える 4

6

そのクラスを作成してから、そのオブジェクトを作成します。

class User {
    public $name, $email; // public for this example, or set these by constructor

    public function __construct( array $fields) {
        foreach( $fields as $field => $value) 
            $this->$field = $value;
    }
}

$object = new User;
$object->name = 'username';
$object->email = 'test@test.com';

または、次のことができます。

$arUserStuff =  array ('name' => 'username', 'email' => 'test@test.com');
$object = new User( $arUserStuff);

からprint_r( $object);、次のような結果が得られます。

User Object ( [name] => username [email] => test@test.com ) 
于 2013-02-06T19:21:09.083 に答える
1

すべての配列キーを新しいクラスに追加せずにクラスを動的に作成したい場合は、 eval を使用することもできます

例:

<?php 
function create_class($name,$properties){

    foreach ($properties as $key=>$value){
        $a[] = 'public $'.$key.';';
        $b[] = '$this->'.$key.' = "'.$value.'";';
    }

    eval("
class $name {
   ".implode('',$a)."
   function __construct() {
   ".implode('',$b)."
   }
};");
    return new $name();
}

print_r( create_class('users',array ('name' => 'username', 'email' => 'test@test.com')) );
?>
users Object
(
    [name] => username
    [email] => test@test.com
)
于 2013-02-06T19:45:42.863 に答える
1

実際にやりたいことをするには、次のようにする必要があります。

$arUserStuff =  new ArrayObject(
  array (
    'name' => 'username', 'email' => 'test@test.com'
  )
);

クラス名を変更するには、新しいクラスを作成する必要があります。これはかなり複雑なプロセスですが、ここで学ぶことができます。

http://php.net/manual/en/language.oop5.php

于 2013-02-06T19:26:16.317 に答える
-1

フィールドがパブリックであると仮定して、配列を任意のタイプのオブジェクトに変換する汎用関数を次に示します。

class User { public $name, $email; }

class Dog { public $name, $breed; }

function objFromArray($className, $arr) {
       $obj = new $className;
       foreach(array_keys(get_class_vars($className)) as $key) {
           if (array_key_exists($key, $arr)) {
               $obj->$key = $arr[$key];
           }           
       }
       return $obj;
}

print_r(objFromArray('User', 
    array ('name' => 'username', 'email' => 'test@test.com')));    
echo "<br/>";
print_r(objFromArray('Dog', 
    array ('name' => 'Bailey', 'breed' => 'Poodle')));

出力

User Object ( [name] => username [email] => test@test.com )
Dog Object ( [name] => Bailey [breed] => Poodle )

そこからトレイトを作成したかったのですが、それをテストするための PHP 5.4 がインストールされていません。これは、フィールドがパブリックである必要はありません

trait ConvertibleFromArray {
    public static function fromArray($arr) {
        var $cls = get_called_class();
        var $obj = new $cls;
        foreach($arr as $key=>$value) {
            if (property_exists($obj, $arr)) {
               $obj->$key = $value;
            }
        }        
        return $obj;
    }
}    
class User {
    use ConvertibleFromArray;
    public $name, $email;
}    
class Dog {
    use ConvertibleFromArray;
    public $name, $breed;
}
print_r(User::fromArray(array ('name' => 'username', 'email' => 'test@test.com')));
print_r(Dog::fromArray(array('name' => 'Bailey', 'breed' => 'Poodle')));

?>

于 2013-02-06T19:55:24.217 に答える