php удалить свойство объекта

Is it possible to delete an object’s property in PHP?

But then I want to remove it, so unset is of no help here.

is kind of it. But is there a more ‘elegant’ way?

php удалить свойство объекта. Смотреть фото php удалить свойство объекта. Смотреть картинку php удалить свойство объекта. Картинка про php удалить свойство объекта. Фото php удалить свойство объекта

5 Answers 5

This works for array elements, variables, and object attributes.

This also works specially if you are looping over an object.

Update

php удалить свойство объекта. Смотреть фото php удалить свойство объекта. Смотреть картинку php удалить свойство объекта. Картинка про php удалить свойство объекта. Фото php удалить свойство объекта

This also works if you are looping over an object.

No need to use brackets.

This code is working fine for me in a loop

php удалить свойство объекта. Смотреть фото php удалить свойство объекта. Смотреть картинку php удалить свойство объекта. Картинка про php удалить свойство объекта. Фото php удалить свойство объекта

Set an element to null just set the value of the element to null the element still exists

unset an element means remove the element it works for array, stdClass objects user defined classes and also for any variable

Not the answer you’re looking for? Browse other questions tagged php object or ask your own question.

Linked

Related

Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.9.17.40238

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Источник

unset

(PHP 4, PHP 5, PHP 7, PHP 8)

unset — Удаляет переменную

Описание

unset() удаляет перечисленные переменные.

Поведение unset() внутри пользовательской функции может отличаться, в зависимости от того, какой тип имеет переменная, которую необходимо удалить.

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

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

Если статическая переменная удаляется внутри функции, unset() удалит переменную только в контексте дальнейшего выполнения функции. При последующем вызове предыдущее значение переменной будет восстановлено.

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

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

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

Функция не возвращает значения после выполнения.

Примеры

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

Пример #2 Использование приведения типа (unset)

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

Примечания

Замечание: Поскольку это языковая конструкция, а не функция, она не может вызываться при помощи переменных функций.

Существует возможность удалить даже атрибуты объекта, видимые в текущем контексте.

При использовании unset() на недоступных или необъявленных свойствах объекта, будет вызван встроенный метод объекта __unset(), если он определён.

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

User Contributed Notes 31 notes

This doesn’t apply to properties of objects that have __isset() methods that visibly change object state or __unset() methods that don’t properly check their arguments or have extra side effects.

The latter case means that __unset shouldn’t do more than what it says on the tin, and also has the responsibility for checking (possibly using __isset()) that what it’s being asked to do makes sense.

The former case is just plain bad design.

if you try to unset an object, please be careful about references.

Objects will only free their resources and trigger their __destruct method when *all* references are unsetted.
Even when they are *in* the object. sigh!

class A <
function __destruct () <
echo «cYa later!!\n» ;
>
>

echo «Finally that thing is gone\n» ;

?>

Of course the object completely dies at the end of the script.

Since unset() is a language construct, it cannot be passed anything other than a variable. It’s sole purpose is to «unset» this variable, ie. to remove it from the current scope and destroy it’s associated data. This is true especially for reference variables, where not the actual value is destroyed but the reference to that value. This is why you can’t wrap ‘unset()’ in a user defined function: You would either unset a copy of the data if the parameter is passed by value, or you would just unset the reference variable within the functions scope if the parameter is passed by reference. There is no workaround for that, as you cannot pass ‘scope’ to a function in PHP. Such a function can only work for variables that exist in a common or global scope (compare ‘unset($_GLOBALS[variable])’).

I don’t know how PHP handles garbage collection internally, but I guess this behavior can result in a huge memory leak: if a value variable goes out of scope with a second variable still holding a reference to the in-memory value, then unsetting that reference would still hold the value in memory but potentially unset the last reference to that in-memory data, hence: occupied memory that is rendered useless as you cannot reference it anymore.

A sample how to unset array elements from an array result coming from a mysql request. In this sample it is checking if a file exists and removes the row from the array if it not exists.

1.
it gets the array from the table (mysql)

3.
unset if record does not exist

Here is another way to make ‘unset’ work with session variables from within a function :

Only This works with register_globals being ‘ON’.

The above will not work with register_globals turned on (will only work outside of a function).

The above will work with register_globals on & inside a function

To clarify what hugo dot dworak at gmail dot com said about unsetting things that aren’t already set:

unsetting a non-existent key within an array does NOT throw an error.

Adding on to what bond at noellebond dot com said, if you want to remove an index from the end of the array, if you use unset, the next index value will still be what it would have been.

but you actually get
Array ( [0] => 1 [4] => 2 [5] => 3 [6] => 4 )

This is since even though the last key is removed, the auto indexing still keeps its previous value.

The only time where this would not seem right is when you remove a value off the end. I guess different people would want it different ways.

Hope this helps someone who may need this for some odd reason, I did.

In addition to what timo dot hummel at 4fb dot de said;

>For the curious: unset also frees memory of the variable used.
>
>It might be possible that the in-memory size of the PHP Interpreter isn’t reduced, but your scripts won’t touch the memory_limit boundary. Memory is reused if you declare new variables.

It might be worth adding that functions apparently don’t free up memory on exit the same way unset does..
Maybe this is common knowledge, but although functions destroys variables on exit, it (apparently) doesn’t help the memory.

So if you use huge variables inside functions, be sure to unset them if you can before returning from the function.

In my case, if I did not unset before return, then the script would use 20 MB more of memory than if I did unset.
This was tested with php 5.0.4 on apache 2 on windows xp, with no memory limit.

Before I did the test, I was under the impression that when you exit from functions, the memory used inside it would be cleared and reused. Maybe this should be made clear in the manual, for either unset() or in the chapter for functions.

Despite much searching, I have not yet found an explanation as to how one can manually free resources from variables, not so much objects, in PHP. I have also seen many comments regarding the merits and demerits of unset() versus setting a variable to null. Thus, here are the results of some benchmarks performed comparing unset() of numerous variables to setting them to null (with regards to memory usage and processing time):

10 variables:
Unset:
Memory Usage: 296
Time Elapsed: 1.0013580322266E-5

Null set:
Memory Usage: 1736
Time Elapsed: 5.9604644775391E-6

50 variables:
Unset:
Memory Usage: 296
Time Elapsed: 3.6001205444336E-5

Null set:
Memory Usage: 8328
Time Elapsed: 3.2901763916016E-5

100 variables:
Unset:
Memory Usage: 296
Time Elapsed: 5.6982040405273E-5

Null set:
Memory Usage: 15928
Time Elapsed: 5.8174133300781E-5

1000 variables:
Unset:
Memory Usage: 296
Time Elapsed: 0.00041294097900391

Null set:
Memory Usage: 168096
Time Elapsed: 0.00067591667175293

10000 variables:
Unset:
Memory Usage: 296
Time Elapsed: 0.0042569637298584

Null set:
Memory Usage: 1650848
Time Elapsed: 0.0076930522918701

100000 variables:
Unset:
Memory Usage: 296
Time Elapsed: 0.042603969573975

Null set:
Memory Usage: 16249080
Time Elapsed: 0.087724924087524

300000 variables:
Unset:
Memory Usage: 296
Time Elapsed: 0.13177299499512

Null set:
Memory Usage: 49796320
Time Elapsed: 0.28617882728577

Perhaps my test code for the null set was flawed, but despite that possibility it is simple to see that unset() has minimal processing time impact, and no apparent memory usage impact (unless the values returned by memory_get_usage() are flawed). If you truly care about the

4 microseconds saved over

In PHP 5.0.4, at least, one CAN unset array elements inside functions from arrays passed by reference to the function.
As implied by the manual, however, one can’t unset the entire array by passing it by reference.

Note that PHP 4 will generate a warning if you try to unset an array index that doesn’t exist and whose parent doesn’t exist.

?>

RESULT: «Notice: Undefined index: Bar»

On PHP5 no error is raised, which seems to me like the correct behaviour.

Note that using unset($foo[‘Bar’]) in the above example does not generate a warning in either version.

(Tested on 4.4.9 and 5.2.4)

Just to confirm, USING UNSET CAN DESTROY AN ENTIRE ARRAY. I couldn’t find reference to this anywhere so I decided to write this.

The documentation is not entirely clear when it comes to static variables. It says:

If a static variable is unset() inside of a function, unset() destroys the variable and all its references.

The above example would output:

And it does! But the variable is NOT deleted, that’s why the value keeps on increasing, otherwise the output would be:

The references are destroyed within the function, this handeling is the same as with global variables, the difference is a static variable is a local variable.

Be carefull using unset and static values as the output may not be what you expect it to be. It appears to be impossible to destroy a static variable. You can only destroy the references within the current executing function, a successive static statement will restore the references.

The documentation would be better if it would say:
«If a static variable is unset() inside of a function, unset() destroys all references to the variable. «

Here’s my variation on the slightly dull unset method. It throws in a bit of 80’s Stallone action spice into the mix. Enjoy!

/**
* function rambo (first blood)
*
* Completely and utterly destroys everything, returning the kill count of victims
*
* @param It don’t matter, it’s Rambo baby
* @return Integer Body count (but any less than 500 and it’s not really worth mentioning)
*/
function rambo () <

// Get the victims and initiate that body count status
$victims = func_get_args ();
$body_count = 0 ;

about unset for arrays

if you unset the last array member
$ar[0]==2
$ar[1]==7
$ar[2]==9

So, unset has no effect to internal array counter.

further I realized that an object, when getting detroyed, does care about destroying variable in object space visibility but not those in local visibility, be aware of the found pattern:

Instead of using the unset function for unregistering your session or other array values you can also do this samll feature and get this task done with just 1 line code.

Suppose, if you like to unregister your session store values.
You can use:

Well this syntax saves lot’s of time instead of unsetting each values.

you may wan’t to unset all variables which are defined, here’s one way:

?>

you can also save than a serialized var of the «memory» and perhaps store this in a temporary file.. very usefull if you work with text files and/or file uploads when you’ve got very large variables.

When unset from an array, if you unset all elements, the array is always set

In regard to some confusion earlier in these notes about what causes unset() to trigger notices when unsetting variables that don’t exist.

Sometimes you need to assigne values to an array index in some loop (if, while, foreach etc.) but you wish to set starting index key to some number greater then zero (lets say 5). One idea how to do this is:

Array ( [5] => 5 [6] => 10 [7] => 15 [8] => 100 )

You can not unset a numeric key of an array, if key is a string. See this example:

And here is the output:

Test: 1
array(3) <
[10]=>
array(1) <
[0]=>
string(6) «apples»
>
[20]=>
array(1) <
[0]=>
string(7) «bananas»
>
[30]=>
array(1) <
[0]=>
string(7) «peaches»
>
>
key: 10
key exists: bool(true)
typeof key is: integer
key: 20
key exists: bool(true)
typeof key is: integer
key: 30
key exists: bool(true)
typeof key is: integer
array(0) <
>

Two ways of unsetting values within an array:

$SomeObj = new TheObj ;

This applied to the «virtual» array variable too, see more at http://bugs.php.net/bug.php?id=33513 (at feedback) about it.
PS: we used PHP version 5.1.0-dev from the CVS snapshot when we wrote the above codes.

1) unsetting of superglobals is done globally, i.e. unsetting inside the function affects GLOBALLY.

foo ();
bar (); //issues E_NOTICE ($GLOBALS not defined)
$GLOBALS = 3 ;
bar (); //displays int(3)

Источник

Как удалить объект PHP из его класса?

Я знаю, что для некоторых это может показаться глупым, но я думал, что если у меня есть метод delete() в классе, который удаляет все данные объекта (из БД и файловой системы), как я могу уничтожить/удалить объект из класса.

это вопрос PHP. Что-то вроде unset($this); возможно ли и мудро? И как правильно это сделать?

7 ответов

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

в классе RaiseFile будет разумно, что после вызова delete() метод и файл удаляется, объект RaiseFile также должен быть удален.

однако из-за проблемы, которую вы упомянули, у меня на самом деле есть настаивать на том, что RaiseFile указывает на файл независимо от того, существует файл или нет. Существование файла можно отслеживать через exists() метод.

скажем, у нас есть функция cut-paste, которая использует представление RaiseFile:

Я сейчас в той же лодке.

Я создаю решение CMS с нуля и имею много ссылок между объектами; пользователи, группы, категории, форумы, темы, сообщения и т. д.

Я также использую загрузчик» Object::getObject(id) » в каждом классе, который гарантирует, что на ID есть только один экземпляр объекта, но также означает, что для кода еще проще вытащить ссылку на существующие объекты.

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

В идеале все ссылки должны быть удалены-ссылочный код может предоставить обратный вызов, который запускается при удалении объекта, который впоследствии может удалить/обновить ссылку. Но если ссылочный код становится небрежным, я бы предпочел ошибку с ошибкой «не объект», чем фактически работать с объектом.

без зная, как заставить разрушение изнутри самого объекта, я вынужден:

начните почти каждый нестатический метод с проверки, чтобы увидеть, был ли объект помечен «удален», создавая исключение, если это так. Это гарантирует, что любой ссылочный код не может причинить никакого вреда, но это неприятная вещь, чтобы посмотреть в коде.

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

ни то, ни другое не понадобилось бы, если бы я мог просто уничтожить объект изнутри.

Это зависит от того, как вы структурировали класс.

Если вы следуете шаблонам DTO/DAO, ваши данные будут отделены от вашей модели, и вы можете просто удалить DTO. Если это не так, просто сбросить данные часть класса должна сделать это.

но на самом деле, я думаю, что это не нужно, так как PHP будет автоматически очищаться в конце запроса. Если вы не работаете над гигантским объектом, который занимает огромное количество памяти, и это долго процесс на самом деле не стоит усилий.

есть _ _ destruct () magic метод, который является деструктором для класса PHP.

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

другой подход состоит в том, чтобы сделать метод delete статическим, который затем может получить объект PDO и данные, которые определяют, что удалить. Таким образом, вам не нужно инициализировать объект.

вот пример решения, которое было бы «разумно использовать» при реализации в четко определенных шаблонах отношений/ссылок, обычно я бросаю что-то подобное в своих композитах. На самом деле использовать текущий код, как я сделал в этом примере в реальной жизни, было бы слишком сложно, но это просто для иллюстрации того, как это сделать.

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

класс, который может безопасно хранить ссылку на наш объект.

и, наконец, класс с способность самоуничтожения ака запускает процесс удаления всеми его родителями.

Источник

PHP: удаление элемента из массива

Я думал, что установка его на null сделал бы это, но, видимо, это не работает.

30 ответов

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

удалить один элемент массива

также, если у вас есть значение и не знаете ключ для удаления элемента, вы можете использовать array_search() получить ключ.

unset() метод

обратите внимание, что при использовании unset() ключи массива не изменятся/reindex. Если вы хотите переиндексировать ключи вы можете использовать array_values() после unset() который преобразует все ключи в числовые перечисляемые ключи, начиная с 0.

array_splice() метод

если вы используете array_splice() ключи будут автоматически переиндексируется, но ассоциативные ключи не будут меняться в отличие от array_values() который преобразует все ключи в числовые ключи.

и array_splice() требуется смещение, а не ключ! в качестве второго параметра.

array_splice() же unset() принять массив по ссылке, это означает, что вы не хотите присвоить возвращаемые значения этих функций в массив.

удалить несколько элементы массива

если вы хотите удалить несколько элементов массива и не хочу называть unset() или array_splice() несколько раз, вы можете использовать функции array_diff() или array_diff_key() в зависимости от того, знаете ли Вы значения или ключи элементов, которые вы хотите удалить.

array_diff() метод

array_diff_key() метод

также, если вы хотите использовать unset() или array_splice() для удаления нескольких элементов с одинаковым значением можно использовать array_keys() чтобы получить все ключи для определенного значения, а затем удалить все элементы.

следует отметить, что unset() сохранит индексы нетронутыми, чего и следовало ожидать при использовании строковых индексов (массив в качестве хэш-таблицы), но может быть довольно удивительно при работе с целочисленными индексированными массивами:

так array_splice() может использоваться, если вы хотите нормализовать целочисленные ключи. Другой вариант-использовать array_values() после unset() :

это вывод из кода выше:

теперь array_values () красиво переиндексирует числовой массив, но удалит все ключевые строки из массива и заменит их числами. Если вам нужно сохранить имена ключей (строки) или переиндексировать массив, если все ключи числовые, используйте array_merge ():

Если у вас есть численно индексированный массив, где все значения уникальны (или они не уникальны, но вы хотите удалить все экземпляры определенного значения), вы можете просто использовать array_diff () для удаления соответствующего элемента, например:

это отображает следующее:

в этом примере элемент со значением ‘Charles’ удаляется, что может быть проверено вызовами sizeof (), которые сообщают размер 4 для исходный массив, и 3 после удаления.

также для именованного элемента:

уничтожить один элемент массива

unset()

Если вам нужно повторно индексировать массив:

mixed array_pop(array &$array)

mixed array_shift ( array &$array )

чтобы избежать поиска, можно поиграть с array_diff :

в этом случае не нужно искать/использовать ключ.

unset() уничтожает указанные переменные.

поведение unset() внутри функции может варьироваться в зависимости от типа переменной, которую вы пытаетесь уничтожить.

если глобализованная переменная unset() внутри функции уничтожается только локальная переменная. Переменная в вызывающей среде сохранит то же значение, что и раньше unset() называлась.

ответ вышеуказанного кода будет бар

до unset() глобальная переменная внутри функции

Если вам нужно удалить несколько значений в массиве, а записи в этом массиве являются объектами или структурированными данными, [array_filter][1] это ваш лучший ставку. Те записи, которые возвращают true из функции обратного вызова будут сохранены.

ассоциативные массивы

числовые массивы

Примечание

Если вам нужно удалить несколько элементов из ассоциативного массива, вы можете использовать array_diff_key () (здесь используется с array_flip ()):

Я просто хотел сказать, что у меня был определенный объект, который имел переменные атрибуты (это было в основном отображение таблицы, и я менял столбцы в таблице, поэтому атрибуты в объекте, отражающие таблицу, также будут отличаться

цель $fields было просто так, что мне не нужно смотреть везде в коде, когда они меняются, я просто смотрю в начале класса и меняю список атрибутов и $fields содержимое массива для отражения новых атрибутов.

Мне потребовалось некоторое время, чтобы понять это. Надеюсь, это может кому-то помочь.

следуйте функциям по умолчанию

Предположим, у вас есть такой массив:

а также вы получаете:

unset () несколько фрагментированных элементов из массива

хотя unset() упоминалось здесь несколько раз, еще не упоминалось, что unset () принимает несколько переменных, что упрощает удаление нескольких несмежных элементов из массива за одну операцию:

unset () динамически

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

вместо этого unset () можно использовать динамически в цикле foreach:

удалите ключи массива, скопировав массив

очевидно, что такая же практика применяется к текстовым строкам:

решения:

далее объяснение:

использование этих функций удаляет все ссылки на эти элементы из PHP. Если вы хотите сохранить ключ в массиве, но с пустым значением, присвоить пустую строку к элементу:

помимо синтаксиса, есть логическая разница между использованием unset () и присвоение » элементу. Первый говорит: This doesn’t exist anymore, в то время как второй говорит This still exists, but its value is the empty string.

если вы имеете дело с числами, присвоение 0 может быть лучшая альтернатива. Таким образом, если компания остановила производство звездочки модели XL1000, она обновит свой инвентарь с помощью:

однако, если у него временно закончились звездочки XL1000, но он планировал получить новую партию с завода позже на этой неделе, это лучше:

если вы unset () элемент, PHP настраивает массив так, чтобы цикл все еще работал правильно. Он не компактирует массив, чтобы заполнить недостающие отверстия. Этот это то, что мы имеем в виду, когда говорим, что все массивы ассоциативны, даже когда они кажутся числовыми. Вот пример:

чтобы сжать массив в плотно заполненный числовой массив, используйте array_values ():

кроме того, array_splice () автоматически оленей массивы, чтобы избежать оставляя отверстия:

это полезно, если вы используете массив в очереди и хотите, чтобы удалить элементы из очереди в то же время позволяя случайный доступ. Чтобы безопасно удалить первый или последний элемент из массива, используйте array_shift () и array_pop (), соответственно.

Источник

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

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