Странности со свойствами класса.

aXis

Новичок
Странности со свойствами класса.

Вот напоролся на такое дело: php 5.16 среда разработки Eclipse. register_globals=off apache 1.3 Win XP
PHP:
<?php
class Test{

	public $fop="bla-bla";
	
	/*public $f="~^(?:(?:https?|ftp|telnet)://(?:[a-z0-9_-]{1,32}".
   "(?::[a-z0-9_-]{1,32})?@)?)?(?:(?:[a-z0-9-]{1,128}\.)+(?:com|net|".
   "org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)(?:(?".
   "!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.,_@%&".
   "?+=\~/-]*)?(?:#[^ '\"&<>]*)?$~i";*/
	
	function Test(){
		 $f="~^(?:(?:https?|ftp|telnet)://(?:[a-z0-9_-]{1,32}".
   "(?::[a-z0-9_-]{1,32})?@)?)?(?:(?:[a-z0-9-]{1,128}\.)+(?:com|net|".
   "org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)(?:(?".
   "!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.,_@%&".
   "?+=\~/-]*)?(?:#[^ '\"&<>]*)?$~i";
	}
}
?>
Как видите в методе есть переменная $f и ей присвоена длинная строка. Все нормально.
и есть public $fop. Ей тоже присвоена строка и тоже все нормально.

А теперь раскоментирую я public $f и всему хана. Причем строчка точная копия того что в методе. Даже если я уберу "." и соедению прямо, все равно не прохавает.

Где то в строке глюк или есть ограничения на длину строки?

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

Андрейка

Senior pomidor developer
что значит непрохавает? чет не могунайти такого определения в мануале
 

Nogrogomed

Новичок
1. А ты пробовал уменьшать строку?
2. А ты вообще хоть что-то пробовал?

пхп не прохавает из-за корявого кода. Ошибку я нашел. А вот теперь найди и ты.

П.С. но о причине подобной ошибки в ПХП можно только догадываться
 

hermit_refined

Отшельник
Даже если я уберу "." и соедению прямо, все равно не прохавает.
классика жанра - написать заведомо неправильно, и при этом упомянуть, что если написать (почти) так, как надо - "все равно" не сработает.
вы, случайно, не марсианин?..

а так - забавно (советую понять, в чем причина). но при соблюдении правил хорошего тона - таких, как использование single quotes там, где не требуются double quotes, такие ляпы невозможны.
(хотя тут и вовсе надо использовать конструктор.)
 

Nogrogomed

Новичок
hermit_refined
а почему тогда при явном задании значения он выдает ошибку? По идее символ "~" - это неверный символ для имени переменной. Т.е. теоретически должно работать.
 

sage

Новичок
hermit_refined
ну-ка про классику жанра поподробнее.... где это вы про такие правила хорошего тона прочитали? и какие ляпы вы имеете в виду? да ещё и о каком-то конструкторе заговорили.... да и при чём здесь вообще какие-то кавычки, если та же самая строка без public отрабатывает на ура....

hermit_refined
Nogrogomed
пролейте свет на эту тёмную историю )
 

hermit_refined

Отшельник
ну-ка про классику жанра поподробнее....
конкатенация строк в объявлении свойств запрещена (см. мануал).
где это вы про такие правила хорошего тона прочитали?
если это для вас вопрос религиозный - оставим.
лично для меня очевидно, что использование избыточного синтаксиса затрудняет чтение кода человеком.
да ещё и о каком-то конструкторе заговорили....
вы никогда не инициализируете свойства в конструкторе? ;-)

по сути же - это особенности парсера, см. определения:

class_variable_declaration: class_variable_declaration ',' T_VARIABLE
| class_variable_declaration ',' T_VARIABLE '=' static_scalar
| T_VARIABLE
| T_VARIABLE '=' static_scalar

static_scalar: common_scalar
| T_STRING
| '+' static_scalar
| '-' static_scalar
| T_ARRAY '(' static_array_pair_list ')'
| static_class_constant

common_scalar: T_LNUMBER
| T_DNUMBER
| T_CONSTANT_ENCAPSED_STRING
| T_LINE
| T_FILE
| T_CLASS_C
| T_METHOD_C
| T_FUNC_C

где T_CONSTANT_ENCAPSED_STRING - либо (["]([^$"\\]|("\\".))*["]), либо ([']([^'\\]|("\\".))*[']). (т.е. если в строке присутствует неэкранированный $ - она уже воспринимается как сложное выражение, заключенное в двойные кавычки.)

Ссылки:
Zend/zend_language_parser.output
Zend/zend_language_scanner.l
(исходники - лучшая документация ;-) )
 

Андрейка

Senior pomidor developer
по сути же - это особенности парсера
чет сложно написано... по сути это же раздел the basics главы Классы и объекты мануала
 

hermit_refined

Отшельник
по сути это же раздел the basics главы Классы и объекты мануала
ну, тогда вам не составит труда привести цитату, подробно объясняющую, что такое "constant expression" в "The default value must be a constant expression, not (for example) a variable, a class member or a function call.", и почему, например, "test$" уже не "constant expression" - ага? ;-)
 

Андрейка

Senior pomidor developer
hermit_refined
там вроде даже пример топикстартера есть... ну могу и поискать, если не понятно)
а вы пока поищите там-же что такое variable, class member и function
 

aXis

Новичок
Nogrogomed
Пробовал уменьшать и без контантенации и знаю что если убрать последнюю часть и контантенацию то все прокатит.

Значит дело было в последней части.
hermit_refined ответил почему.

Вот не знал о такой особенности, теперь буду знать.
>вы никогда не инициализируете свойства в конструкторе? ;-)

ну почему же. я делаю так как мне удобнее или как диктует ситуация. Но:
Во-первых, не хочется лишний раз захламлять конструктор.
Во-вторых, конструктор базового класса, если задан, не вызывается автоматически. Это \"фича\" пхп. И не всегда удобно явно ручками прописывать вызов.

Тут вопрос не стоял, как обойти - это орешки. Вопрос был почему. И ответ дан. Всем спасибо.

зы: вот я например не знал об этой особенности. Выражение не мое - искал супер пупер для валидации урла.
 

Андрейка

Senior pomidor developer
hermit_refined
чесслово, ну не разделяю вашей радости)) мож у вас есть какие-то основания пологать, что "aaa$" не является тем самым constant expression, а у меня нет.. ( мож с этим на bugs.php.net ?
 

aXis

Новичок
Андрейка
Является таковым :). Так думает мануал и, возможно, создатели языка.
Только вот парсер думает иначе. Особенность у него такая :)
 

hermit_refined

Отшельник
мож с этим на bugs.php.net ?
с чем? изъясняйтесь, pls, внятно.
Так думает мануал и, возможно, создатели языка
ну началось, ага, конечно, сами не знают, чего написали.
просто в мануале иногда не хватает формальных описаний.
 

Андрейка

Senior pomidor developer
интересная логика) нафик меня тыкать в глючные исходники?)

T_CONSTANT_ENCAPSED_STRING "foo" or 'bar' string syntax
-> Строки - Двойные кавычки
Но самым важным свойством строк в двойных кавычках является обработка переменных. Смотрите более подробно: обработка строк.
->Обработка переменных - Простой синтаксис
Если интерпретатор встречает знак доллара ($), он захватывает так много символов, сколько возможно, чтобы сформировать правильное имя переменной.

Переменные - Основы
Переменные в PHP представлены знаком доллара с последующим именем переменной. ... Имена переменных соответствуют тем же правилам, что и остальные наименования в PHP. Правильное имя переменной должно начинаться с буквы или символа подчеркивания с последующими в любом количестве буквами, цифрами или символами подчеркивания Это можно отобразить регулярным выражением: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'

ну и? ясень фикь, что это expected behavour, других в пхп не бывает
 
Сверху