[php5] interface arrayAccess и reference

Profic

just Profic (PHP5 BetaTeam)
[php5] interface arrayAccess и reference

PHP 5.0.0-dev (cli) (built: Jun 28 2004 16:29:27) with Xdebug v2.0.0dev, by Derick Rethans
на таком коде
PHP:
<?php
class arr implements arrayAccess {
	public $a = array ();

	public function offsetExists ($offset) {
		echo 'Checking existens of offset ' . $offset . '<br>';
		return array_key_exists ($offset, $this->a);
	}

	public function offsetGet ($offset) { // (1)
		echo 'Getting offset ' . $offset . '<br>';
		if (isset ($this->a[$offset])) {
			return $this->a[$offset];
		} else {
			return NULL;
		}
	}

	public function offsetSet ($offset, $value) {
		if (!is_string ($offset) && !is_int ($offset) && $offset !== NULL) {
			throw new Exception ('"' . $offset . '" (' . getType ($offset) . '): offset is not int');
			return false;
		}
		if ($offset === NULL) {
			if (sizeof ($this->a)) {
				$last = (int) max (array_keys ($this->a));
				$offset = $last > 0 || array_key_exists ($last, $this->a) ? ++$last : 0;
			} else {
				$offset = 0;
			}
		}
		echo 'Setting offset ' . $offset . '<br>';
		$this->a[$offset] = $value;
		return false;
	}

	public function offsetUnset ($offset) {
		echo 'Unsetting offset ' . $offset . '<br>';
		unset ($this->a[$offset]);
		return false;
	}
}

try {
	$o = new arr ();
	$o['a'] = 'a';
	$var = &$o['a']; // (2)
	var_dump ($o);
} catch (Exception $e) {
	echo nl2br ($e->__toString ());
}
?>
выдает
Setting offset a
Getting offset a
Fatal error: Objects used as arrays in post/pre increment/decrement must return values by reference in ...\test.parser.php on line 80
"line 80" это, что в исходнике пемечено (2)
Я понимаю, что эта ошибка означает, но там имхо не хватает в перечислении еще и "assign by reference"

misc
но когда я добавляю в строке (1) перед offsetGet & и ключаю E_STRICT, то получаю сообщение Only variable references should be returned by reference
ситуацию не спасает даже return $temp = NULL; все равно кричит, что константу возвращаю
Ааа. Про return $temp = NULL; я понял :) Ведь и так константа-то получается :)
На этот раздел внимания не обращайте :)

Тони
Я чего-то не понял или некоторые ошибки из класса E_STRICT мигрировали в E_ERROR?
Как минимум одна перечисленная тобой в http://phpclub.ru/talk/showthread.php?postid=345691#post345691
а именно
Declaration of %s::%s() should be compatible with that of %s::%s()
у меня возникает когда декларация метода в классе реализующем интерфейс отличается от описания этого метода в интерфейсе.

ЗЫЫ. Кстати а Дерик знает, что его xdebug-2.0.0-dev начиная с виндового билда от прошлого понедельника падает при завершении работы php. Связано это видимо с изменениями с EMPTY_STRING

-~{}~ 26.07.04 18:26:

Кстати не знаю как сейчас, но reflection api кидает exception если метод класса объявлен с использованием ключевого слова self (или parent - не уверен), с сообщением, что не знает такого класса

-~{}~ 26.07.04 18:29:

пример забыл :)
PHP:
class test {
   public function tes2 (self $var);
}
 

tony2001

TeaM PHPClub
>Я чего-то не понял или некоторые ошибки из класса E_STRICT мигрировали в E_ERROR?
нет, все так и осталось.
Код:
zend_error(E_STRICT, "Declaration of %s::%s() should be compatible with that of %s::%s()", ...
>ЗЫЫ. Кстати а Дерик знает, что его xdebug-2.0.0-dev начиная с виндового билда от
>прошлого понедельника падает при завершении работы php. Связано это видимо с
>изменениями с EMPTY_STRING
да, знает.
он в отпуске просто.

>Кстати не знаю как сейчас, но reflection api кидает exception
http://bugs.php.net ?
 

Profic

just Profic (PHP5 BetaTeam)
tony2001
А как насчет
>Я понимаю, что эта ошибка означает, но там имхо
>не хватает в перечислении еще и "assign by reference"
?

>нет, все так и осталось.
видимо этот еггог :) в другом месте происходит
>да, знает.
>он в отпуске просто.
понятно
>http://bugs.php.net ?
Угу. Просто думал, что это уже известно :)

-~{}~ 26.07.04 20:12:

Странно, баг с reflection API, пока повторить не могу. Буду завтра мучить. На свежую голову
 
Сверху