создание пустого объекта php
Лучший способ создать пустой объект в JSON с PHP?
для создания пустого объекта JSON я обычно использую:
приведение null к объекту работает, но есть ли другой предпочтительный способ и/или какие-либо проблемы с этим решением?
6 ответов:
ваше решение может работать..
в документации указано, что (object) null приведет к пустому объекту, поэтому некоторые могут сказать, что ваш код действителен и что это метод для использования.
если значение любого другого типа преобразуется в объект, создается новый экземпляр встроенного класса stdClass создается. Если значение равно NULL, то новый экземпляр будет пустой.
.. но, постарайтесь сохранить его в безопасности!
хотя вы никогда не знаете, когда/если выше будут меняться, так что если вы хотите быть на 100% уверены, что вы всегда будете в конечном итоге с помощью <> в закодированных данных, вы можете использовать Хак, таких как:
хотя это утомительно и некрасиво, я предполагаю / надеюсь, что json_encode/json_decode совместим с одним и другим и всегда будет оценивать следующее правда:
Рекомендуемый метод
если вы используете объекты в качестве динамических словарей (и я думаю, что вы делаете), то я думаю, что вы хотите использовать ArrayObject.
он отображается в словарь JSON, даже когда он пуст. это здорово, если вам нужно различать списки (массивы) и словари (ассоциативные массивы):
вы также можете легко манипулировать им (как и с ассоциативным массивом), и он будет правильно отображаться в a словарь:
Если вам нужно, чтобы это было 100% совместимо и способы, вы также можете обернуть json_decode Так что он возвращает ArrayObjects вместо stdClass объекты (вам нужно будет пройти по дереву результатов и рекурсивно заменить все объекты, что является довольно простой задачей).
Ну json_encode() просто возвращает строку из массива PHP / object / etc. Вы можете достичь того же эффекта гораздо более эффективно делать:
нет смысла в использовании функции для этого.
обновление Согласно вашим обновлениям комментариев, Вы можете попробовать:
хотя я не уверен, что это лучше, чем то, что ты делаешь.
для создания пустого объекта в JSON с PHP я использовал
что необходимо, потому что потом я должен сделать это
Создание объектов PHP в стиле JS литеральной нотации
Основные способы создания объектов в JavaScript:
1. Оператор new
2. Литеральная нотация
Использование возможностей анонимных классов PHP 7
Объекты в PHP появились сравнительно поздно и, поэтому для их создания всегда необходим класс. Поддержка анонимных классов была добавлена в PHP 7.
В версиях ниже PHP 7 используеются другой механизм
От ассоциативных массивов к объектам PHP
Создаем ассоциативный массив
С помощью привидения типов создаем объект из массива. Массивы преобразуются в object с именами полей, названными согласно ключам массива и соответствующими им значениям, за исключением числовых ключей, которые не будут доступны пока не проитерировать объект.
Если необходимо начать с пустого объекта, то это делается следующими способами:
А затем к пустому объекту добавляются свойства
Методы
В JavaScript можно делать так:
Начиная с PHP 5.3 в языке появлись замыкания.
А начиная с PHP 7.0 можно делать почти как в JavaScript.
Выражение $tyapk->say() не работает. Всё потому, что методы и свойства класса PHP находятся в разных неймспейсах (можно иметь метод и свойство с одним именем, например say() и say), и когда вы пытаетесь достучать до say(), интерпретатор ничего подходящего среди методов не находит.
В отдельных случаях (когда функция обратного вызова не является массивом или строкой) можно воспользоваться магическим методом invoke:
Статья написана по мотивам JavaScript-style object literals in PHP Здесь же можно прочитать про шаблон с __call и еще несколько хаков.
Отличное актуальное объяснение на счет вызовов замыканий есть на stackoverflow
Создание пустого объекта php
class foo
<
function do_foo ()
<
echo «Код foo.» ;
>
>
Полное рассмотрение производится в разделе Классы и Объекты.
Преобразование в объект
При преобразовании любого другого значения, оно будет помещено в поле с именем scalar соответствующему типу.
User Contributed Notes 28 notes
By far the easiest and correct way to instantiate an empty generic php object that you can then modify for whatever purpose you choose:
In PHP 7 there are a few ways to create an empty object:
= new \ stdClass ; // Instantiate stdClass object
$obj2 = new class<>; // Instantiate anonymous class
$obj3 = (object)[]; // Cast empty array to object
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.
As of PHP 5.4, we can create stdClass objects with some properties and values using the more beautiful form:
echo «‘ ;
?>
works and displays:
stdClass Object
(
[a] => A
[b] => B
[0] => C
)
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.
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() );
Do you remember some JavaScript implementations?
// var timestamp = (new Date).getTime();
Now it’s possible with PHP 5.4.*;
print (new Foo )-> a ; // I’m a!
print (new Foo )-> getB (); // I’m b!
?>
or
/**
* Used for checking empty objects/array
* @uses How to check empty objects and array in php code
* @author Aditya Mehrotra
*/
/**
* Empty class
*/
class EmptyClass <
$obj = new stdClass ();
//or any other class empty object
$emptyClassObj = new EmptyClass ();
$array = array();
//Result SET 1
//array is empty => expected result
//object is not empty => ouch what happened
//EmptyClass is not empty => ouch what happened
/**
* So what we do for checking empty object
* @solution use any known property or check property count
* Or you can use below method
* Count function will not return 0 in empty object
*/
//Result SET 2
//array is empty => expected result ##everything is all right
//object is empty => expected result ##everything is all right
//EmptyClass is empty => expected result ##everything is all right
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.
?>
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.
In PHP 5+, objects are passed by reference. This has got me into trouble in the past when I’ve tried to make arrays of objects.
For example, I once wrote something like the following code, thinking that I’d get an array of distinct objects. However, this is wrong. This code will create an array of multiple references to the same object.
notice that the value at each index in the array is the same. That is because the array is just 3 references to the same object, but we change the property of this object every time the for loop runs. This isn’t very useful. Instead, I’ve changed the code below so that it will create an array with three distinct references to three distinct objects. (if you’re having a hard time understanding references, think of this as an array of objects, and that this is just the syntax you have to use.)
Notice how the creation of a new object («$arrayItem = new myNumber();») must happen every time the for loop runs for this to work.
This took me forever to figure out, so I hope this helps someone else.
If you need to force json_encode() to produce an object even when an array is empty or does not have successive 0-based numeric indices, you can simply convert the array to an object. JSON_FORCE_OBJECT does the same with ALL arrays, which might not be what you want.
echo json_encode ([[]]), «\n» ;
// output: [[]]
echo json_encode ([[]], JSON_FORCE_OBJECT ), «\n» ;
// output: <"0":<>>
echo json_encode ([(object)[]]), «\n» ;
// output: [<>]
in php 7.2 this code works despite documentation said it gives false
= (object) array( ‘1’ => ‘foo’ );
PHP supports recursive type definitions as far as I’ve tried. The class below (a _very_ simple tree) is an example:
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.
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().
/* Output:
(object) array (‘prop1’ => true, ‘prop2’ => (object) array (‘test’ => ‘abc’, ‘other’ => 6.2, ‘arr’ => array (0 => 1, 1 => 2, 2 => 3)), ‘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().
Создание пустого объекта php
Объект является одним из базовых понятий объектно-ориентированного программирования.
Объект представляет собой переменную, экземпляр которой создается по специальному шаблону, называемому классом. Концепции объектов и классов являются неотъемлемой частью парадигмы объектно-ориентированного программирования (ООП).
class foo
<
function do_foo ()
<
echo «Doing foo.» ;
>
>
Внутри объекта данные и код (члены класса) могут быть либо открыты, либо нет. Открытые данные и члены класса являются доступными для других частей программы, которые не являются частью объекта. А вот закрытые данные и члены класса доступны только внутри этого объекта.
Описание классов в PHP начинаются служебным словом class:
Для объявления объекта необходимо использовать оператор new:
Объект = new Имя_класса;
Данные описываются с помощью служебного слова var. Метод описывается так же, как и обыкновенная функция. Методу также можно передавать параметры.
Пример класса на PHP:
Доступ к класам и объектам в PHP
Мы рассмотрели, каким образом описываются классы и создаются объекты. Теперь нам необходимо получить доступ к членам класса, для этого в PHP предназначен оператор —>. Приведем пример:
Чтобы получить доступ к членам класса внутри класса, необходимо использовать указатель $this, которы всегда относится к текущему объекту. Модифицированный метод Getname():
Таким же образом, можно написать метод Setname():
Теперь для изменения имени можно использовать метод Setname():
А вот и полный листинг кода:
Указатель $this можно также использовать для доступа к методам, а не только для доступа к данным:
Инициализация объектов
Главное не забыть вызвать функцию сразу после создания объекта, либо вызвать какой-нибудь метод между созданием (оператор new) объекта и его инициализацией (вызовом Init).
Для того, чтобы PHP знал, что определенный метод нужно вызывать автоматически при создании объекта, ему нужно дать имя такое же, как и у класса (Coor):
Метод, инициализирующий объект, называется конструктором. Однако, PHP не имеет деструкторов, поскольку ресурсы освобождаюся автоматически при завершении работы скриптов.
Преобразование в объект
Как определить пустой объект в PHP
с новым массивом я делаю это:
Есть ли аналогичный синтаксис для объекта
ОТВЕТЫ
Ответ 1
При сканировании или массиве Объект, вы получаете экземпляр StdClass. Вы можете использовать stdClass когда вам нужен общий объект экземпляр.
Ответ 2
Стандартный способ создания «пустого» объекта:
Но, с PHP >= 5.4, я лично предпочитаю использовать:
Это короче, и я лично считаю его более ясным, потому что stdClass может вводить в заблуждение начинающих программистов (т.е. «Эй, я хочу объект, а не класс!». ).
См. руководство по PHP (здесь):
stdClass. Создается при помощи метода typecasting для объекта.
Если объект преобразуется в объект, он не изменяется. Если значение любого другого типа преобразуется в объект, создается новый экземпляр встроенного класса stdClass.
Однако помните, что empty ($ oVal) возвращает false, поскольку @PaulP сказал:
Объекты без свойств больше не считаются пустыми.
Относительно вашего примера, если вы пишете:
PHP создает следующее Предупреждение, неявно создающее свойство key1 (сам объект)
Предупреждение: создание объекта по умолчанию из пустого значения
Это может быть проблемой, если ваша конфигурация (см. уровень отчетности об ошибках) показывает это предупреждение в браузере. Это еще одна тема, но быстрый и грязный подход может использовать оператор управления ошибкой (@), чтобы игнорировать предупреждение:
Ответ 3
Я хочу указать, что в PHP нет такой вещи, как пустой объект в смысле:
С другой стороны, пустой массив пуст в обоих случаях
Цитата из функции changelog empty
Объекты без свойств больше не считаются пустыми.
Ответ 4
php.net сказал, что это лучше всего:
Ответ 5
Мне нравится, как легко создавать объекты анонимного типа в JavaScript:
Поэтому я всегда стараюсь писать такие объекты на PHP, как javascript:
Но поскольку это в основном массив, вы не можете делать такие вещи, как назначение анонимных функций для свойства, подобного js:
Ну, вы можете это сделать, но IMO не практично/чисто:
Кроме того, используя этот синтаксис, вы можете найти забавные сюрпризы, но отлично работает в большинстве случаев.
Ответ 6
В дополнение к зомбату ответ, если вы продолжаете забывать stdClass
Теперь вы можете сделать:
Ответ 7
для доступа к данным в stdClass аналогичным образом с асоциальным массивом просто используйте синтаксис <$ var>.
Ответ 8
Вы можете использовать new stdClass() (который рекомендуется):
Или вы можете преобразовать пустой массив в объект, который создает новый пустой экземпляр встроенного класса stdClass:
Или вы можете преобразовать значение null в объект, который создает новый пустой экземпляр встроенного класса stdClass:
Ответ 9
Вы также можете попробовать этот путь.
Ответ 10
Как указывали другие, вы можете использовать stdClass. Однако я думаю, что он чист без(), например:
Однако на основе вопроса кажется, что вы действительно хотите, чтобы иметь возможность добавлять свойства к объекту «на лету». Вам не нужно использовать stdClass для этого, хотя вы можете. Действительно, вы можете использовать любой класс. Просто создайте экземпляр объекта любого класса и начните устанавливать свойства. Мне нравится создавать свой собственный класс, чье имя просто o с некоторыми базовыми расширенными функциональными возможностями, которые я люблю использовать в этих случаях, и хорошо для распространения из других классов. В основном это мой собственный базовый класс объектов. Мне также нравится иметь функцию, просто называемую o(). Например:
Это отличный старт для базового «языка» для создания других языковых слоев, когда верхний слой записывается в полные внутренние DSL. Это похоже на стиль разработки lisp, а PHP поддерживает его лучше, чем большинство людей понимают. Я понимаю, что это немного касательно вопроса, но вопрос касается того, что я считаю основой для полного использования возможностей PHP.
Ответ 11
Если вы хотите создать объект (например, в javascript) с динамическими свойствами, не получая предупреждение о свойстве undefined.
Ответ 12
Мы можем просто создать пустой объект с помощью этого метода:
Я знаю, что это старый вопрос, но кажется, что некоторые люди забывают о конструкторах.
Ответ 13
Если вы не хотите этого делать:
Вы можете использовать одно из следующих действий:
PHP >= 5.4
Ответ 14
Используйте для него пары значений общего класса и карты.
Или выделите массив в объект
Ответ 15
Вот пример с итерацией:
Ответ 16
У вас есть эта плохая, но полезная техника: