Using objects as arrays in PHP_PHP Tutorial

WBOY
Release: 2016-07-13 17:44:06
Original
785 people have browsed it

   我们了解,JAVASCRIPT中,对象的属性、方法,是可以用数组的模式来访问的。但通常情况下是不可能的。

        为什么要这么做?这是因为,通过这一方式,可以更加方便地操作对象,我们可以定义一个类。而不是定义一个Key Value数组。自然,如果我们还有其它的办法,一种最简单的,就是强制转换成数组。但,这样会失去对象中原有的方法。

        不过,SPL中的ArrayObject可以帮助我们用数组模式访问属性。但方法仍不能实现。

        ArrayObject类结构如下(部分方法是在php5,1或php5.2时才加上的):

Php代码 
ArrayObject implements IteratorAggregate , Traversable , ArrayAccess , Serializable , Countable {  
/* 常量 */ 
const integer STD_PROP_LIST = 1 ;  
const integer ARRAY_AS_PROPS = 2 ;  
/* 方法 */ 
__construct ([ mixed $input [, int $flags [, string $iterator_class ]]] )  
void append ( mixed $value )  
void asort ( void )  
int count ( void )  
array exchangeArray ( mixed $input )  
array getArrayCopy ( void )  
int getFlags ( void )  
ArrayIterator getIterator ( void )  
int getIteratorClass ( void )  
void ksort ( void )  
void natcasesort ( void )  
void natsort ( void )  
bool offsetExists ( mixed $index )  
mixed offsetGet ( mixed $index )  
void offsetSet ( mixed $index , mixed $newval )  
void offsetUnset ( mixed $index )  
public void serialize ( void )  
void setFlags ( int $flags )  
void setIteratorClass ( string $iterator_class )  
void uasort ( callback $cmp_function )  
void uksort ( callback $cmp_function )  
public void unserialize ( string $serialized )  

ArrayObject implements IteratorAggregate , Traversable , ArrayAccess , Serializable , Countable {
/* 常量 */
const integer STD_PROP_LIST = 1 ;
const integer ARRAY_AS_PROPS = 2 ;
/* 方法 */
__construct ([ mixed $input [, int $flags [, string $iterator_class ]]] )
void append ( mixed $value )
void asort ( void )
int count ( void )
array exchangeArray ( mixed $input )
array getArrayCopy ( void )
int getFlags ( void )
ArrayIterator getIterator ( void )
int getIteratorClass ( void )
void ksort ( void )
void natcasesort ( void )
void natsort ( void )
bool offsetExists ( mixed $index )
mixed offsetGet ( mixed $index )
void offsetSet ( mixed $index , mixed $newval )
void offsetUnset ( mixed $index )
public void serialize ( void )
void setFlags ( int $flags )
void setIteratorClass ( string $iterator_class )
void uasort ( callback $cmp_function )
void uksort ( callback $cmp_function )
public void unserialize ( string $serialized )
}

        其中:我们为什么可以用 $obj[name] 直接访问到 $obj->name呢? 主要是上面的方法中的三个方法:

        offsetGet 支持$obj[name] 读的方式

        offsetSet 支持$obj[name] 写的方式

        但foreach则是该类对ArrayAccess的函数Current等的默认实现。

        看一个例子代码:

Php code
class test extends ArrayObject{
public $name;
private $age = 21;
public function show(){
print_r(get_object_vars($this));
}
}
class test1{
public $name;
private $age = 21;
public function show(){
print_r(get_object_vars($this)) ;
}
}
$obj=new test();
//Use array method to read and write attributes
$obj[name]=hello;
$obj[nick] =mockArray;
echo $obj[nick],
;
var_dump($obj[show]);//Check whether the method can be accessed: Output object
$obj->show();//Call method
$arr=(array)$obj; //Force to an array.                                                                                                                                                                                                                                                  print_r ($arr);                                    
$obj1=new test1(); //Create a normal object
$arr1=(array)$obj1; //Forced conversion to an array.
print_r($arr1); //Privacy completely exposed

class test extends ArrayObject{
public $name;

private $age = 21;

public function show(){
print_r(get_object_vars($this));
}
}
class test1{
public $name;
private $age = 21;
public function show(){
print_r(get_object_vars($this));
}
}
$obj=new test();
//Use array method to read and write attributes
$obj[name]=hello;
$obj[nick]=mockArray;
echo $obj[nick],
;
var_dump($obj[show]);//Check whether the method can be accessed:
print_r($obj);//Output object
$obj->show();//Call method
$arr=(array)$obj; //Force to an array.
print_r($arr);
//$arr->show(); This line will cause an error because all the original methods are lost.
$obj1=new test1(); //Create a normal object
$arr1=(array)$obj1; //Force to an array.
print_r($arr1); //Privacy completely exposed

This code will output:

mockArray
NULL

test Object

(

[name] => hello
[nick] => mockArray
)
Array
(
[name] => hello
[nick] => mockArray
)
Array
(
[name] => hello
[nick] => ; mockArray
)
Array
(
[name] =>
It can be seen that you can use array mode to access properties, but you cannot access methods (member functions).

After forced conversion, it is an array object and has no member functions.

Of course, these two methods, offsetGet and offsetSet, can also be further rewritten according to our needs. Why? Because, if there are some very abnormal needs, it will definitely be useful. For example, we want to wrap three arrays into an object using references and access them as an array. At this time, these two functions must be rewritten. Of course, the corresponding functions in the ArrayAccess interface must also be rewritten.

Furthermore, all accessible properties are public properties. If it is private, it cannot be accessed. Even if it is forced to an array, it is the same. But if you don't inherit ArrayObject, it's different. Once such a class is forced to be converted into an array, its privacy (private attributes) will be exposed.

However, we can see that after the private attribute is converted into an array, the original attribute name is not retained. Instead, the form of: a certain non-printable character + class name + non-printable character + attribute name is used. The ASCII value of this unprintable character has not been checked. If you are interested, you can check it out!

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/478766.htmlTechArticleWe understand that in JAVASCRIPT, the properties and methods of objects can be accessed using array mode. But usually this is not possible. Why do this? This is because, by...
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!