如何在php中为对象命名
我有一个关于php中的对象的问题,如何给它命名 当我执行以下操作时:如何在php中为对象命名,php,Php,我有一个关于php中的对象的问题,如何给它命名 当我执行以下操作时: $arUserStuff = array ('name' => 'username', 'email' => 'test@test.com'); $object = (object) $arUserStuff; print_r($object); print函数返回以下内容: stdClass Object ( [name] => username [email] => test@test.co
$arUserStuff = array ('name' => 'username', 'email' => 'test@test.com');
$object = (object) $arUserStuff;
print_r($object);
print函数返回以下内容:
stdClass Object ( [name] => username [email] => test@test.com )
如何更改lets say的用户对象中的std类对象
真的不知道
谢谢 创建该类,然后创建其对象:
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 )
实际上,要想做你想做的事,你应该这样做:
$arUserStuff = new ArrayObject(
array (
'name' => 'username', 'email' => 'test@test.com'
)
);
要更改类名,需要创建一个新类。
这是一个相当复杂的过程,但您可以在此处了解:
如果您想动态创建一个类,而不向新类添加所有数组键,您也可以使用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
)
这里有一个通用函数,假设字段是公共的,它可以将数组转换为任何类型的对象
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')));
我想把它变成一个特性,但没有安装PHP5.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')));
?>标准等级。。我想性病到处都是。。甚至在编程中。语法传播疾病DYou应该添加一个接受数组的构造函数(可能是工厂构造函数),更像OP正在做的事情对不起,这很痛苦,但是你可以通过复制数组中的所有键来创建你不想创建的字段。是的,我知道-这是一个简单问题的简单示例。谢谢你的回答!正是我想知道的!,这给了我第二个问题tho,当我使用你的第二个方法和_自动加载函数结合使用时,它不会工作,因为它找不到类。有没有一种方法可以在不为对象创建类的情况下绕过该类?当找不到该类时,自动加载程序应该能够自动加载该类。你必须发布一个单独的问题,包括你的自动加载程序代码和一条错误消息来诊断这个问题。它可以工作,但看起来脏兮兮的,动态创建的类有什么用?我知道它满足了OP的要求,但是eval太令人困惑了。那是。。。令人厌恶的我希望我从来没有在生产代码中看到过类似的东西。是的,我同意你们两个。
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')));