Как вывести объект php
Перейти к содержимому

Как вывести объект php

  • автор:

Как вывести объект php

Для создания нового объекта, используйте выражение new , создающее в переменной экземпляр класса:

$bar = new foo ;
$bar -> do_foo ();
?>

Полное рассмотрение производится в разделе Классы и Объекты.

Преобразование в объект

Если object преобразовывается в object , объект не изменится. Если значение другого типа преобразовывается в object , создаётся новый экземпляр встроенного класса stdClass . Если значение было null , новый экземпляр будет пустым. Массивы преобразуются в object с именами полей, названными согласно ключам массива и соответствующими им значениям. Обратите внимание, что в этом случае до PHP 7.2.0 числовые ключи не будут доступны, пока не проитерировать объект.

$obj = (object) array( ‘1’ => ‘foo’ );
var_dump (isset( $obj ->< '1' >)); // выводит ‘bool(true)’, начиная с PHP 7.2.0; ‘bool(false)’ ранее
var_dump ( key ( $obj )); // выводит ‘string(1) «1»‘, начиная с PHP 7.2.0; ‘int(1)’ ранее
?>

При преобразовании любого другого значения, оно будет помещено в поле с именем scalar соответствующему типу.

$obj = (object) ‘привет’ ;
echo $obj -> scalar ; // выведет ‘привет’
?>

User Contributed Notes 8 notes

12 years ago

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!

8 years ago

In PHP 7 there are a few ways to create an empty object:

$obj1 = new \stdClass ; // Instantiate stdClass object
$obj2 = new class<>; // Instantiate anonymous class
$obj3 = (object)[]; // Cast empty array to object

var_dump ( $obj1 ); // object(stdClass)#1 (0) <>
var_dump ( $obj2 ); // object(class@anonymous)#2 (0) <>
var_dump ( $obj3 ); // object(stdClass)#3 (0) <>
?>

$obj1 and $obj3 are the same type, but $obj1 !== $obj3. Also, all three will json_encode() to a simple JS object <>:

8 years ago

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 ,
];
?>

7 years ago

echo «» ;
print_r ( $obj ); //stdClass Object created by casting of array

$newobj = new stdClass (); //create a new
$newobj -> name = «India» ;
$newobj -> work = «Development» ;
$newobj -> address = «patna» ;

$new = (array) $newobj ; //convert stdClass to array
echo «» ;
print_r ( $new ); //print new object

##How deals with Associative Array

$test = [ Details =>[ ‘name’ , ‘roll number’ , ‘college’ , ‘mobile’ ], values =>[ ‘Naman Kumar’ , ‘100790310868’ , ‘Pune college’ , ‘9988707202’ ]];
$val = json_decode ( json_encode ( $test ), false ); //convert array into stdClass object

echo «» ;
print_r ( $val );

echo (( is_array ( $val ) == true ? 1 : 0 ) == 1 ? «array» : «not an array» ). «
» ; // check whether it is array or not
echo (( is_object ( $val ) == true ? 1 : 0 ) == 1 ? «object» : «not an object» ); //check whether it is object or not
?>

9 years ago

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.

class stdObject public function __construct (array $arguments = array()) if (!empty( $arguments )) foreach ( $arguments as $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 >)) return call_user_func_array ( $this ->< $method >, $arguments );
> else throw new Exception ( «Fatal error: Call to undefined method stdObject:: < $method >()» );
>
>
>

$obj = new stdObject ();
$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 ;
>;

$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 ( $obj as $func_name => $value ) if (! $value instanceOf Closure )

$obj -> setName ( «John» );
$obj -> setAdresse ( «Boston» );

Работа со свойствами объектов на PHP

Сейчас мы с вами научимся работать с объектами и их свойствами на более практическом примере. Давайте сделаем класс User , который будет описывать юзера нашего сайта. Пусть у нашего пользователя будет два свойства: имя и возраст. Напишем код нашего класса:

Пока наш класс ничего не делает — он просто описывает, что будут иметь объекты этого класса (в нашем случае каждый объект будет иметь имя и возраст). По сути, пока мы не создадим хотя бы один объект нашего класса — ничего полезного не произойдет.

Давайте создадим объект нашего класса. При этом нужно иметь ввиду, что классы принято называть большими буквами, а объекты этих классов — маленькими:

// Создаем объект нашего класса: $user = new User; ?>

Давайте теперь что-нибудь запишем в свойства нашего объекта, а потом выведем эти данные на экран:

$user = new User; // создаем объект нашего класса $user->name = ‘john’; // записываем имя в свойство name $user->age = 25; // записываем возраст в свойство age echo $user->name; // выводим записанное имя echo $user->age; // выводим записанный возраст ?>

Как вы уже поняли — в свойства объекта можно что-то записывать и из свойств можно выводить их содержимое. Давайте теперь сделаем 2 объекта-юзера: ‘john’ и ‘eric’ , заполним их данными и выведем на экран сумму их возрастов:

// Первый объект $user1 = new User; // создаем первый объект $user1->name = ‘john’; // записываем имя $user1->age = 25; // записываем возраст // Второй объект $user2 = new User; // создаем второй объект $user2->name = ‘eric’; // записываем имя $user2->age = 30; // записываем возраст // Найдем сумму возрастов: echo $user1->age + $user2->age; // выведет 55 ?>

Сделайте класс Employee (работник), в котором будут следующие свойства — name (имя), age (возраст), salary (зарплата).

Создайте объект класса Employee , затем установите его свойства в следующие значения — имя ‘john’ , возраст 25 , зарплата 1000 .

Создайте второй объект класса Employee , установите его свойства в следующие значения — имя ‘eric’ , возраст 26 , зарплата 2000 .

Выведите на экран сумму зарплат созданных юзеров.

Выведите на экран сумму возрастов созданных юзеров.

get_object_vars

Возвращает видимые нестатические свойства указанного объекта object в соответствии с областью видимости.

Список параметров

Возвращаемые значения

Возвращает ассоциативный массив нестатических свойств объекта object , доступных в данной области видимости.

Примеры

Пример #1 Пример использования get_object_vars()

class foo private $a ;
public $b = 1 ;
public $c ;
private $d ;
static $e ;

public function test () var_dump ( get_object_vars ( $this ));
>
>

$test = new foo ;
var_dump ( get_object_vars ( $test ));

Результат выполнения приведённого примера:

array(2) < ["b"]=>int(1) ["c"]=> NULL > array(4) < ["a"]=>NULL ["b"]=> int(1) ["c"]=> NULL ["d"]=> NULL >

Замечание:

Неинициализированные свойства считаются недоступными и поэтому не включаются в массив.

Смотрите также

  • get_class_methods() — Возвращает массив имён методов класса
  • get_class_vars() — Возвращает объявленные по умолчанию свойства класса

User Contributed Notes 5 notes

19 years ago

You can still cast the object to an array to get all its members and see its visibility. Example:

class Potatoe public $skin ;
protected $meat ;
private $roots ;

function __construct ( $s , $m , $r ) $this -> skin = $s ;
$this -> meat = $m ;
$this -> roots = $r ;
>
>

$Obj = new Potatoe ( 1 , 2 , 3 );

echo «\n» ;
echo «Using get_object_vars:\n» ;

$vars = get_object_vars ( $Obj );
print_r ( $vars );

echo «\n\nUsing array cast:\n» ;

$Arr = (array) $Obj ;
print_r ( $Arr );

Using get_object_vars:
Array
(
[skin] => 1
)

Using array cast:
Array
(
[skin] => 1
[ * meat] => 2
[ Potatoe roots] => 3
)

As you can see, you can obtain the visibility for each member from this cast. That which seems to be spaces into array keys are ‘\0’ characters, so the general rule to parse keys seems to be:

Public members: member_name
Protected memebers: \0*\0member_name
Private members: \0Class_name\0member_name

I’ve wroten a obj2array function that creates entries without visibility for each key, so you can handle them into the array as it were within the object:

function obj2array ( & $Instance ) $clone = (array) $Instance ;
$rtn = array ();
$rtn [ ‘___SOURCE_KEYS_’ ] = $clone ;

while ( list ( $key , $value ) = each ( $clone ) ) $aux = explode ( «\0» , $key );
$newkey = $aux [ count ( $aux )- 1 ];
$rtn [ $newkey ] = & $rtn [ ‘___SOURCE_KEYS_’ ][ $key ];
>

?>

I’ve created also a bless function that works similar to Perl’s bless, so you can further recast the array converting it in an object of an specific class:

// First get source keys if available
if ( isset ( $Instance [ ‘___SOURCE_KEYS_’ ])) $Instance = $Instance [ ‘___SOURCE_KEYS_’ ];
>

// Get serialization data from array
$serdata = serialize ( $Instance );

list ( $array_params , $array_elems ) = explode ( ‘ list ( $array_tag , $array_count ) = explode ( ‘:’ , $array_params , 3 );
$serdata = «O:» . strlen ( $Class ). «:\» $Class \»: $array_count :

$Instance = unserialize ( $serdata );
return $Instance ;
>
?>

With these ones you can do things like:

define ( «SFCMS_DIR» , dirname ( __FILE__ ). «/..» );
require_once ( SFCMS_DIR . «/Misc/bless.php» );

class Potatoe public $skin ;
protected $meat ;
private $roots ;

function __construct ( $s , $m , $r ) $this -> skin = $s ;
$this -> meat = $m ;
$this -> roots = $r ;
>

function PrintAll () echo «skin keyword»>. $this -> skin . «\n» ;
echo «meat keyword»>. $this -> meat . «\n» ;
echo «roots keyword»>. $this -> roots . «\n» ;
>
>

$Obj = new Potatoe ( 1 , 2 , 3 );

echo «\n» ;
echo «Using get_object_vars:\n» ;

$vars = get_object_vars ( $Obj );
print_r ( $vars );

echo «\n\nUsing obj2array func:\n» ;

$Arr = obj2array ( $Obj );
print_r ( $Arr );

echo «\n\nSetting all members to 0.\n» ;
$Arr [ ‘skin’ ]= 0 ;
$Arr [ ‘meat’ ]= 0 ;
$Arr [ ‘roots’ ]= 0 ;

echo «Converting the array into an instance of the original class.\n» ;
bless ( $Arr , Potatoe );

if ( is_object ( $Arr ) ) echo «\$Arr is now an object.\n» ;
if ( $Arr instanceof Potatoe ) echo «\$Arr is an instance of Potatoe class.\n» ;
>
>

1 year ago

Please be aware of hidden behaviors with uninitialised properties. The note explains : « Uninitialized properties are considered inaccessible, and thus will not be included in the array. » but that’s not entirely true in PHP 8.1. It depends if the property is type-hinted or not.

class Example
public $untyped ;
public string $typedButNotInitialized ;
public ? string $typedOrNullNotInitialized ;
public ? string $typedOrNullWithDefaultNull = null ;
>

var_dump ( get_object_vars (new Example ()));
?>

will print :

array(2) [«untyped»]=>
NULL
[«typedOrNullWithDefaultNull»]=>
NULL
>

As you can see, only «untyped» and «typedOrNullWithDefaultNull» properties are dumped with get_object_vars(). You may encounter problems when migrating old source code and adds carelessly types everywhere without proper initialisation (or default) and assuming it defaults to NULL like old code does.

Hope this helps

2 years ago

When dealing with a very large quantity of objects, it is worth noting that using `get_object_vars()` may drastically increase memory usage.

If instantiated objects only use predefined properties from a class then PHP can use a single hashtable for the class properties, and small memory-efficient arrays for the object properties:

If a class is defined with three properties ($foo, $bar, and $baz), «PHP no longer has to store the data in a hashtable, but instead can say that $foo is proprety 0, $bar is proprety 1, $baz is property 2 and then just store the properties in a three-element C array. This means that PHP only needs one hashtable in the class that does the property-name to offset mapping and uses a memory-efficient C-array in the individual objects.»

However, if you call `get_object_vars()` on an object like this, then PHP WILL build a hashtable for the individual object. If you have a large quantity of objects, and you call `get_object_vars()` on all of them, then a hashtable will be built for each object, resulting in a lot more memory usage. This can be seen in this bug report: https://bugs.php.net/bug.php?id=79392

The effects of this can be seen in this example:

class Example public $foo ;
public $bar ;
public $baz ;
>

function printMem ( $label ) $usage = memory_get_usage ();
echo sprintf ( ‘%s: %d (%.2f MB)’ , $label , $usage , $usage / 1000000 ) . PHP_EOL ;
>

$objects = [];
for ( $i = 0 ; $i < 20000 ; $i ++) $obj = new Example ;
$obj -> foo = bin2hex ( random_bytes ( 5 ));
$obj -> bar = bin2hex ( random_bytes ( 5 ));
$obj -> baz = bin2hex ( random_bytes ( 5 ));
$objects [] = $obj ;
>

printMem ( ‘before get_object_vars’ );

// Clone each object, and get the vars on the clone
foreach ( $objects as $obj ) $c = clone $obj ;
$vars = get_object_vars ( $c );

// Accessing and modifying the original object is fine.
foreach ( $vars as $var => $val ) $obj -> < $var >= strrev ( $val );
>
>

printMem ( ‘get_object_vars using clone’ );

// Get the vars on each object directly
foreach ( $objects as $obj ) $vars = get_object_vars ( $obj );

// The memory is used even if you do not modify the object.
>

printMem ( ‘get_object_vars direct access’ );
?>

The output of this is:

start: 405704 (0.41 MB)
before get_object_vars: 6512416 (6.51 MB)
get_object_vars using clone: 6033408 (6.03 MB)
get_object_vars direct access: 13553408 (13.55 MB)

In short, if you are using classes to avoid additional memory usage associated with hashtables (like in associative arrays), be aware that `get_object_vars()` will create a hashtable for any object passed to it.

This appears to be present in all versions of PHP; I’ve tested it on PHP 5, 7, and 8.

Quotes are from Nikic’s blog posts on arrays and hashtable memory usage, and Github gist «Why objects (usually) use less memory than arrays in PHP».

3 years ago

You can use an anonymous class to return public variables from inside the class:

public function getPublicVars () $me = new class function getPublicVars($object) return get_object_vars($object);
>
>;
return $me->getPublicVars($this);
>

class Test protected $protected;
public $public;
private $private;
public function getAllVars () return call_user_func(‘get_object_vars’, $this);
>
public function getPublicVars () $me = new class function getPublicVars($object) return get_object_vars($object);
>
>;
return $me->getPublicVars($this);
>
>

$test = new Test();
print_r(get_object_vars($test)); // array(«public» => NULL)
print_r($test->getAllVars()); // array(«protected» => NULL, «public» => NULL, «private» => NULL)
print_r($test->getPublicVars()); // array(«public» => NULL)

11 years ago

It seems like there’s no function that determines all the *static* variables of a class.

I’ve come out with this one as I needed it in a project:

function get_class_static_vars ( $object ) <
return array_diff ( get_class_vars ( get_class ( $object )), get_object_vars ( $object ));
>
?>

It relies on an interesting property: the fact that get_object_vars only returns the non-static variables of an object.

  • Функции работы с классами и объектами
    • class_​alias
    • class_​exists
    • enum_​exists
    • get_​called_​class
    • get_​class_​methods
    • get_​class_​vars
    • get_​class
    • get_​declared_​classes
    • get_​declared_​interfaces
    • get_​declared_​traits
    • get_​mangled_​object_​vars
    • get_​object_​vars
    • get_​parent_​class
    • interface_​exists
    • is_​a
    • is_​subclass_​of
    • method_​exists
    • property_​exists
    • trait_​exists
    • _​_​autoload
    • Copyright © 2001-2024 The PHP Group
    • My PHP.net
    • Contact
    • Other PHP.net sites
    • Privacy policy

    get_mangled_object_vars

    Возвращает массив ( array ), в элементах которого свойства (переменные-члены) этого объекта. Ключами будут имена переменных-членов, с некоторыми примечательными исключениями: к закрытым полям класса (private) спереди будет дописано имя класса; к защищённым полям класса (protected) спереди будет добавлен символ * . Эти добавленные значения с обеих сторон также имеют NUL байты. Неинициализированные типизированные свойства автоматически отбрасываются.

    Список параметров

    Возвращаемые значения

    Возвращает массив ( array ), содержащий все свойства объекта object , независимо от области видимости.

    Примеры

    Пример #1 Пример использования get_mangled_object_vars()

    class A
    public $public = 1 ;

    protected $protected = 2 ;

    private $private = 3 ;
    >

    class B extends A
    private $private = 4 ;
    >

    $object = new B ;
    $object -> dynamic = 5 ;
    $object -> < '6' >= 6 ;

    var_dump ( get_mangled_object_vars ( $object ));

    class AO extends ArrayObject
    private $private = 1 ;
    >

    $arrayObject = new AO ([ ‘x’ => ‘y’ ]);
    $arrayObject -> dynamic = 2 ;

    var_dump ( get_mangled_object_vars ( $arrayObject ));

    Результат выполнения приведённого примера:

    array(6) < ["Bprivate"]=>int(4) ["public"]=> int(1) ["*protected"]=> int(2) ["Aprivate"]=> int(3) ["dynamic"]=> int(5) [6]=> int(6) > array(2) < ["AOprivate"]=>int(1) ["dynamic"]=> int(2) >

    Смотрите также

    • get_class_vars() — Возвращает объявленные по умолчанию свойства класса
    • get_object_vars() — Возвращает свойства указанного объекта

    User Contributed Notes

    There are no user contributed notes for this page.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *