Вопрос по константам и массивам в ПХП

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/'

evgen5555



$ELEMENT_PATH = PATH_TO_ROOT . 'account/';


?

bansek

Имхо не стОит в пхп пользоваться константами. У меня сложлось такое впечатление, что они тормозные. Профайлер показывает, что выполнение строчки типа
$tbls = array ('news' => TBL_PRFX . 'news', ...);
занимает половину времени выполнения для довольно нагруженной страницы!

a10063

может надо перекомпилить пхп с оптимизацией? вообще, этого не должно быть
да и какие альтернативы?
на первый пост:
может скобки поставить? какая версия пхп?

bansek

А какие проблемы с альтернативами?
по поводу скорости вот тут в 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
для моего хостинга
Имхо при таком раскладе использовать константы нет вообще никакого смысла.

a10063

респект за тест
по логике этого, очевидно, не должно быть
остается только принять на вооружение...

laki

Не покатит. Это должен в состоянии поменять дизайнер т.к. пока менюшка не из базы берется. А для каждого статичного меню такую шнягу делать.
Правда я пока так и сделал. Кстати нигде никто ничего в разумительного не ответил.
Может это действительно от версии ПХП зависит у меня 4.3.8
Использование констант обусловленно существующим движком. Типа надо придерживаться общего стиля :-( чтоб их...

laki

А да кстати может это зависеть от того что все предопределение идет в классе?

bansek

Эта, невнимательно прочитал вопрос. Сейчас прочитал внимательно.
Вообще странно, что работало:
http://ru3.php.net/manual/en/language.oop.php
In PHP 4, only constant initializers for var variables are allowed.
Результат конкатенации строк не является константным выражением, поэтому, наверное, и не катит:

/* 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");

Например, можешь попробовать разбить любую из строк на две через точку: вместо 'Notify companies online' напиши 'Notify compa'.'nies online'. Будет та же фигня.

laki

Да, попробовал. Та жа ошибка. Блин фигня. Читабельность кода теряется.

bansek

Хмм. Если ты думаешь, что твое объявление маччива читабельно, то вынужден тебя огорчить
Лучше уж напиши ф-ю какую-нибудь. Или объект. Я в твой массив, как видишь, с третьего раза воткнул =)

laki

Да пофиг для меня читабелен такой вид. А дизайнер, да фиг с ним найдет что поправить.

Moskay

(PATH_TO_ROOT . 'account/')
скобки тебе помогут

bansek

Сам-то попробовал? Не помогут они ...

Moskay

Не пробовал, может и не помогут.

Moskay

Ну вы меня прям заинтриговали
Попробовал для PHP5 - работает и первое и второе, только если var оставить вне класса,
то ошибку пишет.

Moskay

define('PATH_TO_ROOT','xaxaxa');
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?

sergei1969

не вникал, чё вы тут тестите, вот что получается в php 4.3.6

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)
}
}
}
}

bansek

Дык ясен корень, что так работать будет!
Проблема именно в динамической инициализации полей класса.
Попробуй так:

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-й ветке работать не будет

Moskay

Хаха, я понял в чем тут дело - константы тут не причем совершенно.
Такое тоже не будет работать:
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
Так что неча тут зря на константы волну гнать, приплели понимаешь

bansek

Обалдеть!
Как это я раньше не додумался?!
http://217.67.124.5/showthreaded.php?Cat=&Board=prog&Number=1463091&page=&view=collapsed&sb=&o=&vc=1
Оставить комментарий
Имя или ник:
Комментарий: