It is always wrong to assume that some operation, like casting to a resource makes no sense. People will always find some extreme case where it would be useful; like the previous example with mysql. My problem was that I wanted to start daemons from a web interface but the apache filehandles were inherited which caused that apache was unable to restart. If I could only typecast a number to a filehandle and then close it... Instead I had to write a small C program that closes every filehandle and then starts my program. I surely miss Apache2::SubProcess from perl. (Also, in perl you can reopen a file and then close it using IO::Handle module's fdopen. I'm just saying.)
Ресурс
Resource это специальная переменная, содержащая ссылку на внешний ресурс. Ресурсы создаются и используются специальными функциями. Полный перечень этих функций и соответствующих типов ресурсов смотрите в приложении.
Смотрите также описание функции get_resource_type().
Преобразование в ресурс
Поскольку тип resource содержит специальные указатели на открытые файлы, соединения с базой данных, области изображения и тому подобное, преобразование в этот тип не имеет смысла.
Освобождение ресурсов
Благодаря системе подсчета ссылок, введенной в PHP 4 Zend Engine, определение отсутствия ссылок на ресурс происходит автоматически, после чего он освобождается сборщиком мусора. Поэтому, очень редко требуется освобождать память вручную.
Замечание: Постоянные соединения с базами данных являются исключением из этого правила. Они не уничтожаются сборщиком мусора. Подробнее смотрите в разделе о постоянных соединениях.
Resources are commonly used to iterate through a mysql or file handle.
example
<?php
while($row = mysql_fetch_row($resource)){
echo $row[0] ;
}
?>
It's possible to fake this treatment.
<?php
class fakewhile{
public $arrayCount;
public $arrayCounter;
function setArrValues(){
$this->arrValues = array(0 =>array("apple","artichoke","apricot"),1 => array("bears","dogs","cats"));
$this->arrayCounter = 0;
$this->arrayCount = count($this->arrValues);
}
function outputValues(){
/*
* Anything until the if statement is evaluted one more
* time then the array count value
*/
$arrayInfo = $this->arrValues;
$arrCounter = $this->arrayCounter;
if($arrCounter > $this->arrayCount){
return false;
}
$endCounter = $arrCounter+1;
$this->arrayCounter = $endCounter;
return $arrayInfo[$arrCounter];
}
}
$fw = new fakewhile();
$fw->setArrValues();
while($row = $fw->outputValues()){
print_r($row);
}
?>
Hopefully will get someone started on completing a complete application.
I spent an hour trying to create mock setup for testing SQL queries. The explanation here, that a resource contains file handlers and therefore there is no sense in trying to create one is lame. Being unable to redefine functions, creating a fake resource was the second thing I tried to put test in place, but looking at the search results, I see I'm the first one to try... For me it looks like security by obscurity.
