Всем доброго времени суток. Подскажите пожалуйста как исправить ошибку с кодом 18. Залил скрипт букса Супер WM люкс, на платный хостинг хороший, Webhost1.ru, но не в хосте дело не рекламмирую а для точного представления прописал тут хостинг. Так вот сам сайт букса вроде открывается в браузере опера, но при регистрации выдает ошибку под кодом 18 а именно вот такую Fatal error: Call-time pass-by-reference has been removed in /home/user9031/virtualbriz2.ru/zsecurity.php on line 18 тут вроде понятно, что не правельно написана строка 18, а как должно быть написанно в провельной форме в конечном итоге , чтобы ошибки не было вот тут я не догоняю. Для наглядности привожу саму строку 18 из скрипта ошибки вот она self::$instance = new $_class(&$A); и для большего понимания привожу строки с 10 по 25 вот они Код (PHP): ){ $_class = ($Aclass === null) ? __CLASS__ : (string)$Aclass; $_unique = ((bool)$Aunique === false) ? false : true; if(!class_exists($_class)): $_return = false; elseif(is_object(self::$instance)): $_return = &self::$instance; elseif((self::$instance === null) && $_unique): self::$instance = new $_class(&$A); $_return = &self::$instance; else: self::$instance = false; $_return = new $_class(&$A); endif; return $_return; } Подскажите пожалуйста кто знает. Адля болшей точности и понимания всегофайла может нужно будет, привожу весь фойл zsecurity.php вот он: Код (PHP): <? class ZSecurity{ const SELF = 'ZSecurity'; private static $instance = null; public static function &init( $A = null, $Aclass = null, $Aunique = true ){ $_class = ($Aclass === null) ? __CLASS__ : (string)$Aclass; $_unique = ((bool)$Aunique === false) ? false : true; if(!class_exists($_class)): $_return = false; elseif(is_object(self::$instance)): $_return = &self::$instance; elseif((self::$instance === null) && $_unique): self::$instance = new $_class(&$A); $_return = &self::$instance; else: self::$instance = false; $_return = new $_class(&$A); endif; return $_return; } protected function __construct( $A ){ global $_POST; $_POST = $this->tagCLEAN(&$_POST); $_POST = $this->htmlspecialchars(&$_POST); } public function __destruct(){ } final public function htmlspecialchars( $A ){ if(is_string($A)): $_pattern = array('&', "'", '"', '<', '>', '\\'); $_replacement = array('&', ''', '"', '<', '>', '\\\\'); $_return = str_replace($_pattern, $_replacement, $A); elseif(is_array($A)): $_function = __FUNCTION__; foreach($A as &$_value): $_value = $this->$_function(&$_value); endforeach; $_return = &$A; else: $_return = null; endif; return $_return; } final public function unhtmlspecialchars( $A ){ if(is_string($A)): $_pattern = array('&', ''', '"', '<', '>', '\\\\'); $_replacement = array('&', "'", '"', '<', '>', '\\'); $_return = str_replace($_pattern, $_replacement, $A); elseif(is_array($A)): $_function = __FUNCTION__; foreach($A as &$_value): $_value = $this->$_function(&$_value); endforeach; $_return = &$A; else: $_return = null; endif; return $_return; } public function tagCLEAN( $A, $Atag_alloweded = null ){ if($Atag_alloweded === null): $_tag_alloweded = null; elseif(is_scalar($Atag_alloweded)): $_tag_alloweded = (string)$Atag_alloweded; elseif(is_array($Atag_alloweded)): $_tag_alloweded = join(' ', (string)$Atag_alloweded); else: $_tag_alloweded = null; endif; // if(is_scalar($A)): $_return = strip_tags($A, $_tag_alloweded); elseif(is_array($A)): foreach($A as &$_value) $_value = $this->tagCLEAN(&$_value, &$_tag_alloweded); $_return = &$A; else: $_return = null; endif; return $_return; } } $ZSECURITY = &ZSecurity::init(); ?> *Пожалуйста, оформляйте код не выделением цветом впредь, а через специальные теги [code=php][/code].
Проблема вот в чем как я понимаю, ты вызываешь функцию и пытаешься ей передать ссылку (знак & перед переменной), вот например: Код (PHP): self::$instance = new $_class(&$A); причем в коде такого полно, по этому поправить это не так просто, ну в смысле много чего надо переписывать. До какой то версии РНР такое работало, но начиная с какой то версии это отменили (на сколько я знаю с версии 5.4), отсюда и косяки.
Всё понятно. Спасибо бальшое за разьяснение. Ато тут на одном форуме мне голову марочить начали. Когда можно же просто обьснить я так думаю. Спасибо ещё раз.
Спасибо ещё раз огромное. За подсказку в ошибке кода. Всего лишь удалил знаки & со всего файла и всё скрипт заработал.
Я так и зделал, удалил только где выводило ишибку с укозанием строки. Првда типерь другая проблемма. Не могу войти в админ панель. Пишет вот такую фигню, типо файл не найден: 404 File not found. Вот только все файлы на хост залиты, в чём причина, подскажите может кто сталкивался стаким, или опытные знают.
пакажы как ты понял фразу дикларация аргументов функции. ибо логику пиридачи по ссылке надо в прилажении сахранить но убрать то на што ругается новая версия интерпритатора. впалне вазможна 404 ты видиш изза таво что слишком много паудалаял зы. надеюсь, мой русский не смущает твой русский.
Вот из этого файла: Код (Text): <? class ZSecurity{ const SELF = 'ZSecurity'; private static $instance = null; public static function &init( $A = null, $Aclass = null, $Aunique = true ){ $_class = ($Aclass === null) ? __CLASS__ : (string)$Aclass; $_unique = ((bool)$Aunique === false) ? false : true; if(!class_exists($_class)): $_return = false; elseif(is_object(self::$instance)): $_return = &self::$instance; elseif((self::$instance === null) && $_unique): self::$instance = new $_class(&$A); $_return = &self::$instance; else: self::$instance = false; $_return = new $_class(&$A); endif; return $_return; } protected function __construct( $A ){ global $_POST; $_POST = $this->tagCLEAN(&$_POST); $_POST = $this->htmlspecialchars(&$_POST); } public function __destruct(){ } final public function htmlspecialchars( $A ){ if(is_string($A)): $_pattern = array('&', "'", '"', '<', '>', '\\'); $_replacement = array('&', ''', '"', '<', '>', '\\\\'); $_return = str_replace($_pattern, $_replacement, $A); elseif(is_array($A)): $_function = __FUNCTION__; foreach($A as &$_value): $_value = $this->$_function(&$_value); endforeach; $_return = &$A; else: $_return = null; endif; return $_return; } final public function unhtmlspecialchars( $A ){ if(is_string($A)): $_pattern = array('&', ''', '"', '<', '>', '\\\\'); $_replacement = array('&', "'", '"', '<', '>', '\\'); $_return = str_replace($_pattern, $_replacement, $A); elseif(is_array($A)): $_function = __FUNCTION__; foreach($A as &$_value): $_value = $this->$_function(&$_value); endforeach; $_return = &$A; else: $_return = null; endif; return $_return; } public function tagCLEAN( $A, $Atag_alloweded = null ){ if($Atag_alloweded === null): $_tag_alloweded = null; elseif(is_scalar($Atag_alloweded)): $_tag_alloweded = (string)$Atag_alloweded; elseif(is_array($Atag_alloweded)): $_tag_alloweded = join(' ', (string)$Atag_alloweded); else: $_tag_alloweded = null; endif; // if(is_scalar($A)): $_return = strip_tags($A, $_tag_alloweded); elseif(is_array($A)): foreach($A as &$_value) $_value = $this->tagCLEAN(&$_value, &$_tag_alloweded); $_return = &$A; else: $_return = null; endif; return $_return; } } $ZSECURITY = &ZSecurity::init(); ?> я убрал только знак & ито только со строчек:18,22,48,67,94, потомучто выдовало ошибки в этих строках, и страница регистрации заработала, до этого не работала. И вот что получилось в итоге, помоему лишнего ни чего не убил. Код (Text): <? class ZSecurity{ const SELF = 'ZSecurity'; private static $instance = null; public static function &init( $A = null, $Aclass = null, $Aunique = true ){ $_class = ($Aclass === null) ? __CLASS__ : (string)$Aclass; $_unique = ((bool)$Aunique === false) ? false : true; if(!class_exists($_class)): $_return = false; elseif(is_object(self::$instance)): $_return = &self::$instance; elseif((self::$instance === null) && $_unique): self::$instance = new $_class($A); $_return = &self::$instance; else: self::$instance = false; $_return = new $_class($A); endif; return $_return; } protected function __construct( $A ){ global $_POST; $_POST = $this->tagCLEAN($_POST); $_POST = $this->htmlspecialchars($_POST); } public function __destruct(){ } final public function htmlspecialchars( $A ){ if(is_string($A)): $_pattern = array('&', "'", '"', '<', '>', '\\'); $_replacement = array('&', ''', '"', '<', '>', '\\\\'); $_return = str_replace($_pattern, $_replacement, $A); elseif(is_array($A)): $_function = __FUNCTION__; foreach($A as &$_value): $_value = $this->$_function($_value); endforeach; $_return = &$A; else: $_return = null; endif; return $_return; } final public function unhtmlspecialchars( $A ){ if(is_string($A)): $_pattern = array('&', ''', '"', '<', '>', '\\\\'); $_replacement = array('&', "'", '"', '<', '>', '\\'); $_return = str_replace($_pattern, $_replacement, $A); elseif(is_array($A)): $_function = __FUNCTION__; foreach($A as &$_value): $_value = $this->$_function($_value); endforeach; $_return = &$A; else: $_return = null; endif; return $_return; } public function tagCLEAN( $A, $Atag_alloweded = null ){ if($Atag_alloweded === null): $_tag_alloweded = null; elseif(is_scalar($Atag_alloweded)): $_tag_alloweded = (string)$Atag_alloweded; elseif(is_array($Atag_alloweded)): $_tag_alloweded = join(' ', (string)$Atag_alloweded); else: $_tag_alloweded = null; endif; // if(is_scalar($A)): $_return = strip_tags($A, $_tag_alloweded); elseif(is_array($A)): foreach($A as &$_value) $_value = $this->tagCLEAN($_value, $_tag_alloweded); $_return = &$A; else: $_return = null; endif; return $_return; } } $ZSECURITY = &ZSecurity::init(); ?>
понятно... function fname(&$argname) - устаревший вариант декларации функции с передачей значения аргумента по ссылке. на него и ругается. надо оставить просто function fname($argname) fname(&$A) - вызов функции с передачей аргумента по ссылке. и его надо было оставить. а замена на fname($A) приводит к тому что значение аргумента по ссылке не передается а клонируется. поэтому вся модификация которая внутри функции происходит - там и забывается. а не должна. в общем полученный алгоритм в корне не равен исходному и вполне разумно не работает.
В этом прилогаемом файле нет такого, или он гдето в другом файле находится? или я туплю В прилогаемом мной файле такого нет как ты написал, или это гдето в другом файле прописывается, или я ткплю? Поясни пожалуйста.
Ganzal, т.е. вот так НЕ правильно: Код (PHP): function one(&$val) { $val = 'one'; } $zzz = 'zzz'; one($zzz); echo $zzz; А вот так правильно: Код (PHP): function two($val) { $val = 'two'; } $zzz = 'zzz'; two(&$zzz); ??? abatfarea, данный значок, а точнее передача аргумента по ссылке несет важное значение, если его убрать, функции (методы) могут работать не совсем так как надо, исходя из того как они написаны, по этому таким удалением лучше не заниматься.
У меня щас слезы течь начнут. Автор, ну почитай ты уже про передачу переменных по ссылке. Осиль. Там нет ничего сверхъестественного. Это ж не просто так "лишняя закорючка, которую нужно удалить, потому что она сделана только для того, чтобы все перестало работать". И да, по возможности, избегайте передачи по ссылке, если не уверены, что однажды не выстрелите себе в ногу. Исключение - ооочень большие объемы данных, когда передача по значению не вариант ни разу. Вместо modify(&$var) юзайте $var = modify($var). Будет вам счастье и код, над которым вы не потеряете однажды контроль.
Автор, интереса ради, у тебя русский язык родной? Добавлено спустя 47 секунд: И хорошо. Человек учиться начнет - это же здорово.