2014-09-03 3 views
3

Есть ли какой-либо способ в PHP узнать, где была инициализирована переменная или назначена значение для первого раза или где она была последней модификацией?Как узнать, где была инициализирована или изменена переменная

Я думаю, что это должно быть возможно знать, потому что PHP дает такой намек на ошибки. Как: Can not redeclare abc() (previously declared in /path/to/file.php)

EDIT: мне это нужно, потому что:

function abc() { 
    global $page; //this should be int. 
    if($page == 2) { ... } 
} 

Но когда эта функция выполняется; Я получаю ошибку Can not convert object into int. Это связано с тем, что некоторые из которых в моей странице $ $ переопределяются каким-либо объектом. Мне нужно найти место, где оно было изменено. Или мне придется прорыть весь код.

+0

Можете ли вы рассказать нам, зачем вам это нужно? – Justinas

+0

Отслеживание, в котором можно найти объявление функции и где была изменена переменная, - это две разные вещи. Последнее потребует хранения журнала истории всего состояния программы, что просто непомерно дорого. – deceze

+0

вы можете использовать 'isset' см. Http://php.net/manual/en/function.isset.php –

ответ

0

Вы можете узнать, какой объект быть назначен переменными $ страницы переменным с помощью функции get_class родной PHP():

get_class($page); 

Обычно вы хотите отладить это, используя единичный тест, где вы проверите, что переменная $ page является числовой.

Если вы просто хотите, чтобы отладить на экране попробовать:

if(is_object($page)){ 
    die(get_class($page)); 
    } 

или через исключение:

if(is_object($page)){ 
throw new Exception('$page must be numeric object given of type : '.get_class($page)); 
} 

Это поможет вам найти какой объект быть назначен переменной и только точки вы в правильном направлении.

0

Если вы хотите знать, где была определена переменная, вам не повезло; нет способа найти это, кроме того, что вы просматриваете свой код и находите его.

Ваша проблема заключается в том, что вы допускаете переменную в функцию (используя global). Поскольку переменная определена вне функции, она может быть изменена в любое время. Если вы хотите, чтобы всегда знать, что переменная содержит то вы должны передать его в качестве аргумента вместо:

$page = 2; 
function abc($page) { 
    if($page == 2) { ... } 
} 
$test = abc($page); 

Если вы хотите, чтобы убедиться, что значение переменной является числом, то вы можете обнаружить, что путем простого проверки аргумента (или переменная global, по этому вопросу):

if (is_int($page) or ctype_digit($page)) { 
    echo 'The $page variable is a number'; 
} else { 
    echo 'The $page variable is NOT a number'; 
} 
+0

Я считаю, что функция redeclaration не была частью вопроса. Это был всего лишь пример для «отслеживания информации» PHP. – deceze

+0

@deceze Да, вы правы. Я удалил часть о функциях. Спасибо. –

Смежные вопросы