Удаление класса

Self Author

Новичок
Удаление класса

Как-нибудь можно наверняка удалить класс, который был создан через new?
 

moxnatiy

Новичок
только не класс , а обьект( экземпляр класса)

а зачем его удалять?
опиши задачу поподробнее.
 

Self Author

Новичок
Screjet
Это вроде переменная удаляется. А сам класс из памяти вычищается?

-~{}~ 20.12.05 14:25:

moxnatiy
Делается запрос к БД. Количество возвращённых записей может быть от 0 до нескольких сотен.
Для обработки каждой записи заводится класс. Он заводится внутри функции, которая вызывается в цикле по строкам, выданным запросом.
Заводить класс глобальным не хотелось бы...
А создавая каждый раз его внутри функции боюсь, что каждый раз он будет дублироваться в памяти, что, может быть, загадит всю память.
 

white phoenix

Новичок
Self Author
Насколько я знаю, объект удаляется из памяти при удалении последней на него ссылки (это в PHP 5), а в PHP 4 удаляется из памяти при удалении любой ссылки на него (т.к. в PHP 4 очень скверно реализована обьектная модель, и объект привязывается к переменной).
Какая версия у тебя?

-~{}~ 20.12.05 14:38:

P.S. в 5 и 4 отличается само понятие "ссылка на объект"
 

Said

Guest
Класс имеет глобальную область видимости, даже если объявлен внутри функции
 

Self Author

Новичок
white phoenix
4
Значит будем делать unset.

-~{}~ 20.12.05 14:52:

Said
Мне проще его удалить и создать заново, чем чистить его переменные после предыдущего использования.
 

Gas

может по одной?
Класс имеет глобальную область видимости, даже если объявлен внутри функции
получается что следующий код должен работать?
PHP:
  function FunctionTest()
  {
     class ClassTest
     {
       public $var = 10;
     }

  }

  $obj = new ClassTest;
  echo $obj->var;
Результат - Fatal error: Class 'ClassTest' not found in ...
PHP: 5.0.4

p.s. думал вообще parse error будет
 

Screjet

Новичок
Gas
Любопытная конструкция. До вызова ф-ции класс объявлен не будет. Похоже конструкция класса сохраняется как байт-код ф-ции.
 

Self Author

Новичок
Автор оригинала: Said
Класс имеет глобальную область видимости, даже если объявлен внутри функции
Если я правильно понял, имелось в виду, что клас описывается вне процедуры, а переменная класса создаётся внутри.

-~{}~ 20.12.05 15:33:

Автор оригинала: Said
Класс имеет глобальную область видимости, даже если объявлен внутри функции
Хотя, и так не получается:
PHP:
class ClassTest{ 
	var $var = 10; 
} 

function FunctionTest(){ 
	$obj = new ClassTest; 
} 

echo $obj->var;
Не ругается, но и ничего не происходит.
Так что, непонятно, что имелось в виду о глобальной видимости.
 

Gas

может по одной?
Я не знаю что имел ввиду Said, но написано именно об _объявлении класса внутри функции_, и ни о каких объектах речи не идёт. Ну это всё не важно.

А механизм ссылок для PHP4 и PHP5 хорошо описан тут http://phpinside.ru/?q=node/200
 

Self Author

Новичок
В общем, всем спасибо.
Вывод: пользоваться unset.
Вопрос закрыт (я так думаю).
 

Said

Guest
Автор оригинала: Gas
получается что следующий код должен работать?
PHP:
  function FunctionTest()
  {
     class ClassTest
     {
       public $var = 10;
     }

  }

  $obj = new ClassTest;
  echo $obj->var;
Результат - Fatal error: Class 'ClassTest' not found in ...
PHP: 5.0.4

p.s. думал вообще parse error будет
чтобы класс был объявлен нужно ж вызвать эту функцию чтоб она _выполнилась_ :) - класс объявлен внутри функции но видим в любом месте скрипта - т.е. везде можно создавать переменные этого класса (они же экземпляры или объекты)
PHP:
  function FunctionTest()
  {
     class ClassTest
     {
       public $var = 10;
     }

  }

  FunctionTest();

  $obj = new ClassTest;
  echo $obj->var;
 

Gas

может по одной?
чтобы класс был объявлен нужно ж вызвать эту функцию чтоб она _выполнилась_
ага, Screjet об этом сказал. Удивил такой синтаксис, да и только.
 

Said

Guest
Автор оригинала: Self Author
Если я правильно понял, имелось в виду, что клас описывается вне процедуры, а переменная класса создаётся внутри.

-~{}~ 20.12.05 15:33:


Хотя, и так не получается:
PHP:
class ClassTest{ 
	var $var = 10; 
} 

function FunctionTest(){ 
	$obj = new ClassTest; 
} 

echo $obj->var;
Не ругается, но и ничего не происходит.
Так что, непонятно, что имелось в виду о глобальной видимости.
$obj переменная (экземпляр класса) созданная внутри функции естественно снаружи будет не видна.

-~{}~ 20.12.05 16:35:

Автор оригинала: Gas
ага, Screjet об этом сказал. Удивил такой синтаксис, да и только.
то же самое можно так включить класс из другого файла. это вроде как более обычный случай.

PHP:
function somefunc() {
   require_once('someclass.php');
  ....
}
 

Said

Guest
если вызвать второй раз FunctionTest() конечно будет can not redeclare class,

а в моем примере require_once(). И где баг?

или так
PHP:
function FunctionTest()
  {
      if(! class_exists('ClassTest')) {
       class ClassTest
       {
         public $var = 10;
       }
    }
  }
 
Сверху