Php получить свойства объекта

Php получить свойства объекта

как можно получить все свойства extra-* учитывая что их может не быть вообще и быть бесконечно много. Вообще желательно получить свойства menu0 свойств extra-*

1 ответ 1

Если этот объект получился из JSON, то да, как пишут другие нужно просто правильно указать второй параметр у json_decode

json_decode($value,false) — возвращает stdObject
json_decode($value,true) — возвращает массив

Если же приходится работать именно с объектом, то есть два варианта:
1. Преобразовать в json и обратно уже в массив json_decode(json_encode($object),true)
2. Воспользоваться функцией get_object_vars и получить массив свойств объекта

При любых раскладах получаем массив, проходим циклом и находим нужные ключи и их значения

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

Описание

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

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

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

Возвращает ассоциативный массив объявленных свойств класса, видимых из текущей области видимости, с их значением по умолчанию. Получившиеся элементы массива имеют форму varname => value. В случае ошибки возвращается FALSE .

Список изменений

Версия Описание
5.0.3 Вызов get_class_vars() вернет только те свойства, доступ к которым может быть получен из текущей области видимости.
5.0.2 Вызов get_class_vars() не вернет все свойства в качестве массива, в отличие от предыдущего поведения, где protected и private свойства имели префикс с нулевым байтом.
5.0.1 Вызов get_class_vars() вернет все свойства, как при конвертировании объекта в класс.

Примеры

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

var $var1 ; // переменная не имеет начального значения.
var $var2 = "xyz" ;
var $var3 = 100 ;
private $var4 ;

// конструктор
function __construct () <
// изменим значения некоторых свойств
$this -> var1 = "foo" ;
$this -> var2 = "bar" ;
return true ;
>

$my_class = new myclass ();

$class_vars = get_class_vars ( get_class ( $my_class ));

foreach ( $class_vars as $name => $value ) <
echo " $name : $value
" ;
>

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

Пример #2 get_class_vars() и поведение области видимости

function format ( $array )
<
return implode ( ‘|’ , array_keys ( $array )) . "
" ;
>

class TestCase
<
public $a = 1 ;
protected $b = 2 ;
private $c = 3 ;

public static function expose ()
<
echo format ( get_class_vars ( __CLASS__ ));
>
>

TestCase :: expose ();
echo format ( get_class_vars ( ‘TestCase’ ));
?>

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

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

  • get_class_methods() — Возвращает массив имен методов класса
  • get_object_vars() — Возвращает свойства указанного объекта

User Contributed Notes 15 notes

If you want to retrieve the class vars from within the class itself, use $this.

var $a ;
var $b ;
var $c ;
var $d ;
var $e ;

function GetClassVars ()
<
return array_keys ( get_class_vars ( get_class ( $this ))); // $this
>

$class_vars = $Foo -> GetClassVars ();

foreach ( $class_vars as $cvar )
<
echo $cvar . "
" ;
>
?>

Produces, after PHP 4.2.0, the following:

All 3 of get_object_vars, get_class_vars and reflection getDefaultProperties will reveal the name of the array. For serialization I recommend:

= get_class ( $this );
$varTemplate = get_class_vars ( $cName )
foreach ( $varTemplate as $name => $defaultVal ) <
$vars [ $name ] = $this -> $name ; // gets actual val.
>
?>

Читайте также:  Альфа ос alfa os

No scan the $vars and create serialization string how you wish.

This protects against erroneous prior deserializing in maintaining the integrity of the class template and ignoring unintended object properties.

I needed to get only the class static variables, leaving out instance variables.

function get_static_vars ( $class ) <
$result = array();
foreach ( get_class_vars ( $class ) as $name => $default )
if (isset( $class ::$ $name ))
$result [ $name ] = $default ;
return $result ;
>
?>

That function returns only the public ones. The same pattern can be used inside a class, then it returns private and protected static variables, too:

static protected function get_static_vars ( $class = NULL ) <
if (!isset( $class )) $class = get_called_class ();
$result = array();
foreach ( get_class_vars ( $class ) as $name => $default )
if (isset( $class ::$ $name ))
$result [ $name ] = $default ;
return $result ;
>
?>

So I wanted to get a list of the public parameters in a child class using a static function pre-5.3.0 ( class childClass extends parentClass
<
public $id ;
public $name ;

public static function getFields ()
<
return self :: _getFields ( __CLASS__ );
>

>
abstract class parentClass
<
public $idInParent ;
public $nameInParent ;

abstract public static function getFields ();

final protected static function _getFields ( $className )
<
$rtn = array();
foreach ( array_keys ( get_class_vars ( $className )) as $var ) <
$rtn [] = $var ;
>
return $rtn ;
>

var_dump ( childClass :: getFields ());
?>

Results:
array(4) <
[0]=>
string(2) "id"
[1]=>
string(4) "name"
[2]=>
string(10) "idInParent"
[3]=>
string(12) "nameInParent"
>

There seems to be be a function to get constants missing , i.e. get_class_constants() . so here is a simple function for you all. Hopefully Zend will include this in the next round as a native php call, without using reflection.

function GetClassConstants ( $sClassName ) <
$oClass = new ReflectionClass ( $sClassName );
return $oClass -> getConstants ());
>
?>

If you need get the child protected/private vars ignoring the parent vars, use like this:

class childClass extends parentClass <
private $login ;
private $password ;

public function __set ( $key , $val ) <
if ( $key == ‘password’ )
$this -> $key = md5 ( $val );
else
$this -> $key = $val ;
>
>
class parentClass <
public $name ;
public $email ;

function __construct () <
$reflection = new ReflectionClass ( $this );
$vars = array_keys ( $reflection -> getdefaultProperties ());
$reflection = new ReflectionClass ( __CLASS__ );
$parent_vars = array_keys ( $reflection -> getdefaultProperties ());

$my_child_vars = array();
foreach ( $vars as $key ) <
if (! in_array ( $key , $parent_vars )) <
$my_child_vars [] = $key ;
>
>

$child_class = new childClass ();
?>

If you assign a constant value using the self-scope by default to a variable, get_class_vars() will result in a FATAL error.

class Foo <
const Bar = "error" ;

Читайте также:  Athlon ii phenom ii сравнение

public $Foo = self :: Bar ;
>

print_r ( get_class_vars ( "Foo" ));

?>

. but using "Foo::Bar" instead "self::Bar" will work 😉

class someClass <
public function toArray () <
$records = array();

foreach( $this as $key => $value ) <
$records [ $key ] = $value ;
>

in PHP5 to get all the vars (including private etc.) use:

$reflection = new ReflectionClass($class);
$defaults = $reflection->getdefaultProperties();

I propse following for getting Public members, always:
if (! function_exists ( "get_public_class_vars" )) <
function get_public_class_vars ( $class ) <
return get_class_vars ( $class );
>
>
if (! function_exists ( "get_public_object_vars" )) <
function get_public_object_vars ( $object ) <
return get_object_vars ( $object );
>
>
?>

This is to mitigate the problem and a feature that get_object_vars($this) returns private members. Running it simply outside the scope will get the public.

Iterating public members only and their defaults are enormously useful in e.g. in serialization classes such as options where each public member is an serializable that is saved and loaded.

Contrary to multiple comments throughout the manual, get_class_vars() performed within a class can access any public, protected, and private members.

class Foo <
public $x ;
protected $y ;
private $z ;
public function __sleep () <
return( get_class_vars ( __CLASS__ ) );
>
>
?>

works fine (returns x, y, & z). However, given the same class as above,

( get_class_vars ( "Foo" ) );
?>

will NOT return x, y, & z. Instead it will only return the public members (in our case, z).

This is one of the best php functions. Look at what you can do

class Object
<
var $updtFields;//keep track of affected values
function Object($record="") <
if (is_array($record))
<
$this->updtFields = array();
foreach(array_keys(get_class_vars(get_class($this))) as $k)
if (isset($record[$k]))
<
$this->$k = $record[$k];
$this->updtFields[] = $k;
>
>
>//end of arrayToObject

function toDebug($nl=’
‘)
<
foreach(array_keys(get_class_vars(get_class($this))) as $k)
echo "$k = [" . $this->$k . "]<$nl>";
>//end of toDebug
>

Now you can do really cool things. If you have a form like

and you define your class like this
class Person extends Object <
var $name; //same same as in the form
var $phone;
>

when you submmit the form, you can get the data like

$person = new Person($_POST);

//everything in just one line,cool!! Also if you use pear db or adodb when you get data from the database you can do the same thing except use the $row that you get from the database. Remember to ask the result is associative mode.

This is my core Object for everthing I do and it works great.

get_class_vars_assoc()
— Returns an associative array with name of (parent) class(es) as key(s) and corresponding class vars as sub-arrays. My boilerplate for some crude O/R mapping.

Note: vars re-defined in sub-classes are ignored.

class GrandClass <
public $grandVar ;
public $in_grand_and_parent ;
public $in_grand_and_child ;

Читайте также:  Eset nod32 antivirus 4 имена и пароли

public static function load () <
print_r ( self :: get_class_vars_assoc ());
>

protected static function get_class_vars_assoc () <
$called = get_called_class ();
//echo "called: $called
";
$classVars [ $called ] = array_keys ( get_class_vars ( $called ));

$parent = get_parent_class ( $called );
while ( $parent !== FALSE ) <
//echo "parent: $parent
";
$classVars [ $parent ] = array_keys ( get_class_vars ( $parent ));
$classVars [ $called ] = array_diff ( $classVars [ $called ],
$classVars [ $parent ]);
if ( isset( $prevParentVars ) ) <
$prevParentVars = array_diff ( $prevParentVars ,
$classVars [ $parent ]);
>

$prevParentVars = & $classVars [ $parent ];
$parent = get_parent_class ( $parent );
>

class ParentClass extends GrandClass <
public $in_grand_and_parent ;
public $parentVar ;
public $in_parent_and_child ;
>

class ChildClass extends ParentClass <
public $in_grand_and_child ;
public $in_parent_and_child ;
public $childVar ;
>

[ParentClass] => Array
(
[1] => parentVar
[2] => in_parent_and_child
)

[GrandClass] => Array
(
[0] => grandVar
[1] => in_grand_and_parent
[2] => in_grand_and_child
)

У меня есть объект с большим количеством свойств. Некоторые из свойств имеют имена, начинающиеся с одной и той же строки текста (в моем примере – «bullet»), за которым следует целое число.

Я могу получить значения свойств следующим образом:

Я пытаюсь написать цикл for, чтобы получить первые 20 из них, и на данный момент это выглядит примерно так:

Но это не работает. Я знаю, что могу написать что-то вроде

до 20, затем установите цикл for, но я уверен, что должен быть более чистый способ. Может ли кто-нибудь указать мне в правильном направлении?

Так вы можете это сделать:

Хотя я думаю, что использование массива вместо объекта было бы лучшим решением.

является правильным синтаксисом для доступа к полю по имени в PHP.

В вашем случае это будет выглядеть примерно так:

В обоих предыдущих ответах есть «попробуйте, если он не работает, перейдите» и работают в очень конкретной ситуации. Позвольте мне дать вам более общий подход, который, к сожалению, требует PHP 5.

Немного о отражении

Отражение позволяет вам отражать объект или класс для извлечения полезной информации об этом. В частности, вы можете использовать Reflection, чтобы получить все свойства, заданные в классе, будь то статические, во время выполнения или сгенерированные на ходу.

Для этого начните с инициализации объекта Reflection (если ваш объект класса является $ object) следующим образом:

Теперь это даст вам интерфейс для отражения. Обратите внимание на полезный метод ReflectionObject::getProperties() – он позволяет вам получить все свойства, заданные в классе (и вы можете фильтровать по общедоступным, защищенным, приватным и т. Д.), Если это необходимо). Мы будем использовать именно это:

Готово. Полностью общий, работает в любом месте.

в моей системе, что не позволяет мне делать

Я все еще могу получить значение имени переменной «variable» с приведенной ниже функцией; вы можете установить $ property без php, жалуясь на синтаксис или ошибки бросания.

Ссылка на основную публикацию
Adblock detector