Вопрос по константам и массивам в ПХП
$ELEMENT_PATH = PATH_TO_ROOT . 'account/';
?
$tbls = array ('news' => TBL_PRFX . 'news', ...);
занимает половину времени выполнения для довольно нагруженной страницы!
да и какие альтернативы?
на первый пост:
может скобки поставить? какая версия пхп?
по поводу скорости вот тут в user comments есть сообщение в тему:
http://ru3.php.net/manual/en/language.constants.php
Я решил померять свой код сам:
$c_tables = array(
"uasdfs" => "xcvxcvxv",
"spsafds" => "gfhfgh",
"exasfdnf" => "werwerf",
"saffj" => "werwer",
"anvxcce" => "werwer",
"dovcxzvs" => "ertert",
"nasfasfds" => "sdfgsdfg",
"stzvxczvczvy" => "sdfgsdfgy",
"consasdfat" => "xcbvult",
"gasdfok" => "sdfgsdfgok",
"reseaasrch" => "sdfgcvbch",
"adasfdrt" => "ertertd",
"stasdfts" => "sdfgsdfg",
"aasdffdst" => "sdfghvb",
"rasfdfts" => "erthgh",
"casdfsfdf" => "dfghdfgh",
"inzxvcvcx" => "nmvndfgh",
"redgd" => "bnmvb",
"rebccbdlue" => "fgjhjhgue",
"ssdfgcat" => "ghjfjh",
"ssdfsgc" => "cvbxcvbwert",
"spsdgfcatlink" => "dfsgsgak",
"sdfgsd" => "sdfgsdfgdd",
"spexxcbvd" => "dfsgfield",
"swertta" => "dsfgsdfta",
);
$t1 = microtime(true);
define("OLDTBL_PREF", "aaa");
define("TBL_PREF", "bbb");
$c_tables1 = array(
"uasdfs" => TBL_PREF."xcvxcvxv",
...
);
$t1 = microtime(true)-$t1;
$t2 = microtime(true);
$tbl_pref = "aaa";
$oldtbl_pref = "bbb";
$c_tables2 = array(
"uasdfs" => $tbl_pref."xcvxcvxv",
...
);
$t2 = microtime(true)-$t2;
print "t1: ".number_format($t1,7).", t2: ".number_format($t2,7)."";
(создание первого массива, чтобы пхп закэшировал (если умеет) строковые константы)
Результат таков:
t1: 0.0001630, t2: 0.0000940
t1: 0.0001660, t2: 0.0000950
t1: 0.0001810, t2: 0.0000920
t1: 0.0001780, t2: 0.0001050
t1: 0.0001560, t2: 0.0000970
для моего компа (вин2к3, апач, пхп 4.6)
t1: 0.0000750, t2: 0.0000460
t1: 0.0001250, t2: 0.0000640
t1: 0.0001010, t2: 0.0000900
t1: 0.0000720, t2: 0.0000460
t1: 0.0000720, t2: 0.0000470
для моего хостинга
Имхо при таком раскладе использовать константы нет вообще никакого смысла.
по логике этого, очевидно, не должно быть
остается только принять на вооружение...
Правда я пока так и сделал. Кстати нигде никто ничего в разумительного не ответил.
Может это действительно от версии ПХП зависит у меня 4.3.8
Использование констант обусловленно существующим движком. Типа надо придерживаться общего стиля :-( чтоб их...
А да кстати может это зависеть от того что все предопределение идет в классе?
Вообще странно, что работало:
http://ru3.php.net/manual/en/language.oop.php
In PHP 4, only constant initializers for var variables are allowed.Результат конкатенации строк не является константным выражением, поэтому, наверное, и не катит:
Например, можешь попробовать разбить любую из строк на две через точку: вместо 'Notify companies online' напиши 'Notify compa'.'nies online'. Будет та же фигня.
/* None of these will work in PHP 4. */
var $todays_date = date("Y-m-d");
var $name = $firstname;
var $owner = 'Fred ' . 'Jones';
/* Arrays containing constant values will, though. */
var $items = array("VCR", "TV");
Да, попробовал. Та жа ошибка. Блин фигня. Читабельность кода теряется.
Лучше уж напиши ф-ю какую-нибудь. Или объект. Я в твой массив, как видишь, с третьего раза воткнул =)
Да пофиг для меня читабелен такой вид. А дизайнер, да фиг с ним найдет что поправить.
скобки тебе помогут
Сам-то попробовал? Не помогут они ...
Не пробовал, может и не помогут.
Попробовал для PHP5 - работает и первое и второе, только если var оставить вне класса,
то ошибку пишет.
class zzz {
var $m_aMenu0;
var $m_aMenu1;
function zzz {
$this->m_aMenu0= array
(1 => array('Account Overview', PATH_TO_ROOT . 'account/', 0, 0,
array(1 => array('Notify companies online', '#', 0, 0
2 => array('Notify companies offline', '#', 0, 0
3 => array('Notified companies', '#', 0, 0)
)
;
$this->m_aMenu1 = array
(1 => array('Account Overview', PATH_TO_ROOT, 0, 0,
array(1 => array('Notify companies online', '#', 0, 0
2 => array('Notify companies offline', '#', 0, 0
3 => array('Notified companies', '#', 0, 0)
)
;
var_dump($this->m_aMenu0);
var_dump($this->m_aMenu1);
}
}
$z = new zzz;
Вот так все работает в ПХП5.0.1 - кто нить может протестить в 4?
array(1) {
[1]=>
array(5) {
[0]=>
string(16) "Account Overview"
[1]=>
string(14) "xaxaxaaccount/"
[2]=>
int(0)
[3]=>
int(0)
[4]=>
array(3) {
[1]=>
array(4) {
[0]=>
string(23) "Notify companies online"
[1]=>
string(1) "#"
[2]=>
int(0)
[3]=>
int(0)
}
[2]=>
array(4) {
[0]=>
string(24) "Notify companies offline"
[1]=>
string(1) "#"
[2]=>
int(0)
[3]=>
int(0)
}
[3]=>
array(4) {
[0]=>
string(18) "Notified companies"
[1]=>
string(1) "#"
[2]=>
int(0)
[3]=>
int(0)
}
}
}
}
array(1) {
[1]=>
array(5) {
[0]=>
string(16) "Account Overview"
[1]=>
string(6) "xaxaxa"
[2]=>
int(0)
[3]=>
int(0)
[4]=>
array(3) {
[1]=>
array(4) {
[0]=>
string(23) "Notify companies online"
[1]=>
string(1) "#"
[2]=>
int(0)
[3]=>
int(0)
}
[2]=>
array(4) {
[0]=>
string(24) "Notify companies offline"
[1]=>
string(1) "#"
[2]=>
int(0)
[3]=>
int(0)
}
[3]=>
array(4) {
[0]=>
string(18) "Notified companies"
[1]=>
string(1) "#"
[2]=>
int(0)
[3]=>
int(0)
}
}
}
}
Проблема именно в динамической инициализации полей класса.
Попробуй так:
define('PATH_TO_ROOT','xaxaxa');
class zzz {
var $m_aMenu0 = array
(1 => array('Account Overview', PATH_TO_ROOT . 'account/', 0, 0,
array(1 => array('Notify companies online', '#', 0, 0
2 => array('Notify companies offline', '#', 0, 0
3 => array('Notified companies', '#', 0, 0)
)
;
}
имхо и в 5-й ветке работать не будет
Такое тоже не будет работать:
class obj {
var $arr=array('xaxa','baba'.'account');
function zzz {
var_dump($this->arr);
}
}
$o = new obj;
Потому что http://ru.php.net/manual/en/language.oop.php:
class Cart {
/* None of these will work in PHP 4. */
var $todays_date = date("Y-m-d");
var $name = $firstname;
var $owner = 'Fred ' . 'Jones';
/* Arrays containing constant values will, though. */
var $items = array("VCR", "TV");
}
/* This is how it should be done. */
class Cart {
var $todays_date;
var $name;
var $owner;
var $items = array("VCR", "TV");
function Cart {
$this->todays_date = date("Y-m-d");
$this->name = $GLOBALS['firstname'];
/* etc. . . */
}
}
In PHP 4, only constant initializers for var variables are allowed
Так что неча тут зря на константы волну гнать, приплели понимаешь
Как это я раньше не додумался?!
http://217.67.124.5/showthreaded.php?Cat=&Board=prog&Number=1463091&page=&view=collapsed&sb=&o=&vc=1
Оставить комментарий
laki
Чето я не в курюВот такой код работает :
var $m_aMenu = array
(1 => array('Account Overview', PATH_TO_ROOT, 0, 0,
array(1 => array('Notify companies online', '#', 0, 0
2 => array('Notify companies offline', '#', 0, 0
3 => array('Notified companies', '#', 0, 0)
)
;
А такой нет
Parse error: parse error, unexpected '.', expecting ')'
var $m_aMenu = array
(1 => array('Account Overview', PATH_TO_ROOT . 'account/', 0, 0,
array(1 => array('Notify companies online', '#', 0, 0
2 => array('Notify companies offline', '#', 0, 0
3 => array('Notified companies', '#', 0, 0)
)
;
Как явно указать что элемент массива строка PATH_TO_ROOT . 'account/'