php object keys_Object 对象

公西英叡
2023-12-01

用户评论:

[#1]

twitter/matt2000 [2015-04-21 21:28:28]

As of PHP 5.4, we can create stdClass objects with some properties and values using the more beautiful form:

$object= (object) ['propertyOne'=>'foo','propertyTwo'=>42,

];?>

[#2]

Ashley Dambra [2014-02-21 06:38:53]

Here a new updated version of 'stdObject' class. It's very useful when extends to controller on MVC design pattern, user can create it's own class.

Hope it help you.

public function__construct(array$arguments= array()) {

if (!empty($arguments)) {

foreach ($argumentsas$property=>$argument) {$this->{$property} =$argument;

}

}

}

public function__call($method,$arguments) {$arguments=array_merge(array("stdObject"=>$this),$arguments);// Note: method argument 0 will always referred to the main class ($this).if (isset($this->{$method}) &&is_callable($this->{$method})) {

returncall_user_func_array($this->{$method},$arguments);

} else {

throw newException("Fatal error: Call to undefined method stdObject::{$method}()");

}

}

}// Usage.$obj= newstdObject();$obj->name="Nick";$obj->surname="Doe";$obj->age=20;$obj->adresse=null;$obj->getInfo= function($stdObject) {// $stdObject referred to this object (stdObject).echo$stdObject->name." ".$stdObject->surname." have ".$stdObject->age." yrs old. And live in ".$stdObject->adresse;

};$func="setAge";$obj->{$func} = function($stdObject,$age) {// $age is the first parameter passed when calling this method.$stdObject->age=$age;

};$obj->setAge(24);// Parameter value 24 is passing to the $age argument in method 'setAge()'.

// Create dynamic method. Here i'm generating getter and setter dynimically

// Beware: Method name are case sensitive.foreach ($objas$func_name=>$value) {

if (!$valueinstanceOfClosure) {$obj->{"set".ucfirst($func_name)} = function($stdObject,$value) use ($func_name) {// Note: you can also use keyword 'use' to bind parent variables.$stdObject->{$func_name} =$value;

};$obj->{"get".ucfirst($func_name)} = function($stdObject) use ($func_name) {// Note: you can also use keyword 'use' to bind parent variables.return$stdObject->{$func_name};

};

}

}$obj->setName("John");$obj->setAdresse("Boston");$obj->getInfo();?>

[#3]

Ashley Dambra [2014-02-19 18:51:08]

Class like stdClass but with the possibility to add and execute function.

class stdObject {

public function __construct(array $arguments = array()) {

if (!empty($arguments)) {

foreach ($arguments as $property => $argument) {

if ($argument instanceOf Closure) {

$this->{$property} = $argument;

} else {

$this->{$property} = $argument;

}

}

}

}

public function __call($method, $arguments) {

if (isset($this->{$method}) && is_callable($this->{$method})) {

return call_user_func_array($this->{$method}, $arguments);

} else {

throw new Exception("Fatal error: Call to undefined method stdObject::{$method}()");

}

}

}

[#4]

wyattstorch42 at outlook dot com [2013-12-31 17:07:24]

If you call var_export() on an instance of stdClass, it attempts to export it using ::__set_state(), which, for some reason, is not implemented in stdClass.

However, casting an associative array to an object usually produces the same effect (at least, it does in my case). So I wrote an improved_var_export() function to convert instances of stdClass to (object) array () calls. If you choose to export objects of any other class, I'd advise you to implement ::__set_state().

if ($variableinstanceofstdClass) {$result='(object) '.improved_var_export(get_object_vars($variable),true);

} else if (is_array($variable)) {$array= array ();

foreach ($variableas$key=>$value) {$array[] =var_export($key,true).' => '.improved_var_export($value,true);

}$result='array ('.implode(', ',$array).')';

} else {$result=var_export($variable,true);

}

if (!$return) {

print$result;

returnnull;

} else {

return$result;

}

}// Example usage:$obj= newstdClass;$obj->test='abc';$obj->other=6.2;$obj->arr= array (1,2,3);improved_var_export((object) array ('prop1'=>true,'prop2'=>$obj,'assocArray'=> array ('apple'=>'good','orange'=>'great')

));?>

Note: This function spits out a single line of code, which is useful to save in a cache file to include/eval. It isn't formatted for readability. If you want to print a readable version for debugging purposes, then I would suggest print_r() or var_dump().

[#5]

qeremy [atta] gmail [dotta] com [2012-03-02 00:41:01]

Do you remember some JavaScript implementations?

// var timestamp = (new Date).getTime();

Now it's possible with PHP 5.4.*;

public$a="I'm a!";

public$b="I'm b!";

public$c;

public functiongetB() {

return$this->b;

}

public functionsetC($c) {$this->c=$c;

return$this;

}

public functiongetC() {

return$this->c;

}

}

print (newFoo)->a;// I'm a!print (newFoo)->getB();// I'm b!?>

or

->setC($_GET["c"])

->getC();// I'm c!?>

[#6]

helpful at stranger dot com [2012-01-04 13:15:36]

By far the easiest and correct way to instantiate an empty generic php object that you can then modify for whatever purpose you choose:

I had the most difficult time finding this, hopefully it will help someone else!

[#7]

Cosmitar: mhherrera31 at hotmail [2010-12-07 22:47:40]

i would like to share a curious behavior on casted objects. Casting an object from a class with private/protected attributes results a stdClass with a private/protected attribute for get.

Example:

private$priv=1;

public$pub=2;

public functiongetSimple(){

return (object)(array)$this;//the array cast is to force a stdClass result}

}$bar= newFoo();var_dump($bar->getSimple();// output: object(stdClass)#3 (2) { ["priv:private"]=> int(1) ["pub"]=> int(2) }var_dump($bar->getSimple()->priv);// output: NULL, not a Fatal Errorvar_dump($bar->getSimple()->pub);// output: int(2)$barSimple=$bar->getSimple();$barSimple->priv=10;var_dump($barSimple->priv);// output: int(10)?>

[#8]

Anonymous [2010-01-05 14:10:20]

Initialization, Instantiation and Instances are terms that can be confusing at first. Let's try to sort it out starting with this simple class definition.

public$first_name;

public$last_name;

public function__toString()

{

return"User [first='$this->first_name', last='$this->last_name']";

}

}?>

Now create several INSTANCES of User by INSTANTIATING the User class above.

$user_1= newUser;// $user_1 is an INSTANCE of User$user_2= newUser;// $user_2 is an INSTANCE of Userecho$user_1.'
';// User [first='', last='']echo$user_2.'
';// User [first='', last='']?>

Here we have (2) two INSTANCES of User, but each instance was only INSTANTIATED once - when we used the 'new' operator.

And now looking at the printed output, you can see there are no values for their first or last names. This means that the objects themselves have NOT been INITIALIZED. To remedy this situation, rewrite the class definition by adding a __construct() method.

public$first_name;

public$last_name;

public function__construct($first,$last)// Require first and last names when INSTANTIATING{$this->first_name=$first;// INITIALIZE $first_name;$this->last_name=$last;// INITIALIZE $last_name;}

public function__toString()

{

return"User [first='$this->first_name', last='$this->last_name']";

}

}?>

Now try it again.

$user_1= newUser('John','Doe');// $user_i is an INSTANCE of User$user_2= newUser('Jane','Doe');// $user_2 is an INSTANCE of Userecho$user_1.'
';// prints: User [first='John', last='Doe']echo$user_2.'
';// prints: User [first='Jane', last='Doe']?>

The __construct() method is called automatically by PHP when it sees the 'new' operator. Our __construct() method above requires the first and last names to be passed in as arguments and uses them to INITIALIZE objects when INSTANTIATING new INSTANCES.

[#9]

mailto dot aurelian at gmail dot com [2009-12-18 09:56:02]

You can create [recursive] objects with something like:

$literalObjectDeclared= (object) array('foo'=> (object) array('bar'=>'baz','pax'=>'vax'),'moo'=>'ui');

print$literalObjectDeclared->foo->bar;// outputs "baz"!?>

[#10]

spidgorny at gmail dot com [2009-07-22 01:58:33]

If having

class BugDetails extends Bug

you want to cast an object of a Bug to BugDetails like this

$clone= (BugDetails) clone$this;// OR$clone= (BugDetails)$bug;?>

which doesn't work in PHP, you have two options:

1. Copying all (including private) properties manually (you could also use get_object_vars(), but this is shorter):

$clone= newBugDetails();

foreach ($thisas$key=>$val) {$clone->$key=$val;

}?>

2. Serialize an object Bug, manipulate the resulting string so that it has BugDetails inside and unserialize it.

See here: http://blog.adaniels.nl/articles/a-dark-corner-of-php-class-casting/

Spent two hours looking for more elegant solution, that's my findings.

[#11]

cFreed at orange dot fr [2009-04-22 18:21:01]

CAUTION:

"Arrays convert to an object with properties named by keys, and corresponding values".

This is ALWAYS true, which means that even numeric keys are accepted when converting.

But the resulting properties cannot be accessed, since they don't match the variables naming rules.

So this:

$x= (object) array('a'=>'A','b'=>'B','C');

echo'

'.print_r($x,true).'
';?>

works and displays:

stdClass Object

(

[a] => A

[b] => B

[0] => C

)

But this:

<?phpecho '
'.$x->a;

echo'
'.$x->b;

echo'
'.$x->{0};# (don't use $x->0, which is obviously a syntax error)?>

fails and displays:

A

B

Notice: Undefined property: stdClass::$0 in...

[#12]

Isaac Z. Schlueter i at foohack dot com [2008-08-30 17:31:18]

In response to Harmor and Mithras,  you can use the json functions to convert multi-dimensional arrays to objects very reliably.

Also, note that just using (object)$x doesn't allow you to access properties inline.  For example, this is invalid:

$x= array("foo"=>"bar");

echo ((object)$x)->foo;// PHP Parse error, unexpected T_OBJECT_OPERATOR?>

However, this function will let you do that, and will also handle multi-dimensional arrays without any hassle.

return (is_object($x) ||is_array($x)) ?json_decode(json_encode($x)) : (object)$x;

}

echoto_object( array("foo"=>"bar") )->foo;// "bar"?>

Note that *numeric* arrays will not be converted to objects using this method.

[#13]

Mithras [2008-08-21 06:54:49]

In response to harmor: if an array contains another array as a value, you can recursively convert all arrays with:

foreach($arrayas$key=>$value){

if(is_array($value) )$array[$key] =arrayToObject($value);

}

return (object)$array;

}?>

[#14]

gabe at fijiwebdesign dot com [2007-05-21 21:25:48]

In response to sirbinam.

You cannot call a function or method before it exists. In your example, the global instance of stdout is just being passed around to differnet references (pointers). It however exists in the "dump" function scope via the global keyword.

The code below works fine and illustrates that "stdout" has been defined before its instantiation.

functionprofiler(){$this->starttime=microtime();

}

functiondump(){

global$stdout;$this->endtime=microtime();$duration=$this->endtime-$this->starttime;$stdout->write($duration);

}

}

classstdout{

functionwrite($msg){

echo$msg;

}

}$stdout=& newstdout();$profiler=& newprofiler();$profiler->dump();?>

All classes and functions declarations within a scope exist even before the php execution reaches them. It does not matter if you have your classes defined on the first or last line, as long as they are in the same scope as where they are called and are not in a conditional statement that has not been evaluated yet.

[#15]

ludvig dot ericson at gmail dot com [2006-08-18 15:35:13]

In reply to the usort thing, you can access a property of an object dynamically by:

$obj= (object)array("Test"=>"bar")$var="Test";

echo$obj->$var;?>

This will output "bar", and do notice I call on ->$var and not just ->var.

[#16]

Trevor Blackbird > yurab.com [2005-11-26 21:33:48]

You can create a new object using the built-in stdClass or by using type-casting:

<?php // This is the proper way$object1= newstdClass();// This works too$object2= (object)NULL;// This will create an object from an array$monkey_array= array('title'=>'Spider Monkey','src'=>'monkey.jpg');$monkey_object= (object)$monkey_array;

print$monkey_object->title.' '.$monkey_object->src;// You can type-cast in the middle of an expressionfunctioncustomHTML($some_object) {// this function expects an object as the argument and returns some output}

print'

Writing some output '.customHTML( (object) array('rows'=>3,'cols'=>4) );?>

[#17]

iblun at gmx dot net [2005-03-09 05:08:17]

To sort an array, that contains an object, after one fieldname inside the object, im using this function:

function objectSort($objectarray, $field)

{

for ($a=0;$a 

{

for ($b=0;$b 

{

if ($objectarray[$a]->$field $field)

{

$temp = $objectarray[$a];

$objectarray[$a] = $objectarray[$b];

$objectarray[$b] = $temp;

}

}

}

return $objectarray;

}

[#18]

mortoray at ecircle-ag dot com [2005-02-16 02:07:39]

If you use new to create items in an array, you may not get the results you want since the parameters to array will be copies of the original and not references.

By Example:

class Store {

var $item = 3;

}

$a = array( new Store() );

$b = $a;

$a[0]->item = 2;

print( "|" . $b[0]->item . "| 
" );   //shows 3

$a = array();

$a[] =& new Store();

$b = $a;

$a[0]->item = 2;

print( "|" . $b[0]->item . "| 
" );   //shows 2

This is extremely important if you intend on passing arrays of classes to functions and expect them to always use the same object instance!

Note: The following syntax is desired (or maybe even the default notation should translate as this):

$a = array( &new Store() );

[#19]

info at keltoi-web dot com [2003-08-25 14:26:40]

PHP supports recursive type definitions as far as I've tried. The class below (a _very_ simple tree) is an example:

class Tree {

var $_value = null;

var $_children = array();

function Tree ($value) {

$this->_value = $value;

}

function addChild ($value) {

$aux_node = new Tree ($value);

$this->_children [] = $aux_node;

return $aux_node;

}

}

As you can see, in addChild we reference Tree again...

However, you must be careful about references. See the chapter "References explained" for more details.

Hope this helps.

 类似资料: