Javascript-подобные объекты в PHP? - PullRequest
6 голосов
/ 09 декабря 2010

У меня есть вопрос. В JS очень удобно создавать такие объекты:

test = { foo : { bar : "hello world" }, bar2 : "hello world 2" }

, а затем используйте их как

test.foo.bar
test.bar2

Есть ли что-нибудь подобное в PHP без объявления классов?

Ответы [ 8 ]

7 голосов
/ 09 декабря 2010

Это называется ассоциативными массивами.

Пример (примечание: отступ предназначен для макета):

$test = array(
  'foo' => array(
     'bar' => 'hello world'
   ),
  'bar2' => 'hello world 2'
);
$test['foo']['bar'];
$test['bar2'];

Это эквивалентно следующему коду Javascript:

var test = {
  'foo': {
    'bar': 'hello world',
  },
  'bar2': 'hello world 2'
};

В качестве альтернативы вы можете использовать предварительно объявленный StdClass.

$test = new StdClass;
$test->foo = new StdClass;
$test->foo->bar = 'hello world';
$test->bar2 = 'hello world 2';

, который будет записан в JavaScript как:

var test = new Object;
test.foo = new Object;
test.foo.bar = 'hello world';
test.bar2 = 'hello world 2';

(примечание: new Object - этотакой же как {} в Javascript)

7 голосов
/ 09 декабря 2010

stdClass позволяет создавать (по существу) объекты без типов.Например:

$object = (object) array(
    'name' => 'Trevor',
    'age' => 42
);

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

$object = (object) array(
    'name' => 'Trevor',
    'age' => '42',
    'car' => (object) array(
        'make' => 'Mini Cooper',
        'model' => 'S',
        'year' => 2010
     )
);

Другой метод - преобразовать ассоциативный массив в объект впоследствии с помощью рекурсивной функции.Вот пример.

function toObject(array $array) {
    $array = (object) $array;
    foreach ($array as &$value)
        if (is_array($value))
            $value = toObject($value);

    return $array;
}
// usage:
$array = // some big hierarchical associative array...
$array = toObject($array);

Это полезно, когда вы не тот, кто создает ассоциативный массив.

К сожалению, даже если PHP 5.3 поддерживает анонимные методы, вы не можете поместить анонимный методв класс stdClass (хотя вы можете поместить его в ассоциативный массив).Но это не так уж плохо;если вам нужна функциональность, вам действительно следует создать класс.

2 голосов
/ 09 декабря 2010

Вы можете использовать объект StdClass или ArrayObject, которые включены в php (хотя последний требует, чтобы у вас был установлен SPL).Хотя, если вам не нужен конкретный доступ к значениям с помощью оператора ->, эффективнее использовать вместо него ассоциативный массив.

0 голосов
/ 08 января 2013

Попробуйте следующим образом: https://github.com/ptrofimov/jslikeobject

Автор реализовал JS-подобные объекты, вы даже можете получить доступ к свойствам из функций через $ this указатель.

Но, возможно, это не очень хорошо использоватьтакие предметы вместо обычных.

0 голосов
/ 09 декабря 2010

Единственная причина сделать это, если вы хотите передать данные обратно в функцию JavaScript с JSON.В этом случае используйте json_encode для массива.В противном случае просто сохраните его в виде массива, поскольку нет смысла его кодировать, а затем декодировать, чтобы он выглядел как JavaScript.

0 голосов
/ 09 декабря 2010

Технически, нет.Однако, если вы создаете объект данных (т.е. никаких методов), вы можете технически написать строку JSON и использовать

$obj = json_decode($obj_string);

Однако я бы не рекомендовал это делать.Я предполагаю, что будет существенная потеря скорости.

EDIT Хотя это само собой разумеется, для этого следует использовать ассоциативные массивы вместо плоских объектов данных.

0 голосов
/ 09 декабря 2010

Ближайшей вещью будут массивы.

$test = array(
  'foo' => array('bar' => 'hello world'),
  'bar2' => 'hello world 2',
);

echo $test['foo']['bar'];
0 голосов
/ 09 декабря 2010

Я думаю, что вы ищете Associative Array

$test["foo"]["bar"]

http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=keyed+arrays

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...