Я написал функцию (debug_display
), которая умеет печатать, массивы, объекты и информацию о файле.
<?php
function debug_display($var,$show = false) {
if($show) { $dis = 'block'; }else { $dis = 'none'; }
ob_start();
echo '<div style="display:'.$dis.';text-align:left; direction:ltr;"><b>Idea Debug Method : </b>
<pre>';
if(is_bool($var)) {
echo $var === TRUE ? 'Boolean(TRUE)' : 'Boolean(FALSE)';
}else {
if(FALSE == empty($var) && $var !== NULL && $var != '0') {
if(is_array($var)) {
echo "Number of Indexes: " . count($var) . "\n";
print_r($var);
} elseif(is_object($var)) {
print_r($var);
} elseif(@is_file($var)){
$stat = stat($var);
$perm = substr(sprintf('%o',$stat['mode']), -4);
$accesstime = gmdate('Y/m/d H:i:s', $stat['atime']);
$modification = gmdate('Y/m/d H:i:s', $stat['mtime']);
$change = gmdate('Y/m/d H:i:s', $stat['ctime']);
echo "
file path : $var
file size : {$stat['size']} Byte
device number : {$stat['dev']}
permission : {$perm}
last access time was : {$accesstime}
last modified time was : {$modification}
last change time was : {$change}
";
}elseif(is_string($var)) {
print_r(htmlentities(str_replace("\t", ' ', $var)));
} else {
print_r($var);
}
}else {
echo 'Undefined';
}
}
echo '</pre>
</div>';
$output = ob_get_contents();
ob_end_clean();
echo $output;
unset($output);
}
Во избежание коллизий - в общем, проблемы с объектами, которые не имеют свойства со значением, которое вы ожидаете. Объекты в JS часто используются в качестве карт-значений ключей, а ключи могут быть произвольными строками - например, __defineGetter__
, hasOwnProperty
или что-то менее специальное. Теперь, когда вы хотите вызвать такую функцию на неизвестном объекте, например hasOwnProperty
, часто используется в общих функциях перечисления, где любой JSON может быть передан, - вы никогда не можете быть уверены, есть ли у вас перезаписанное свойство (это может даже не быть быть функцией) или оригинал, который вы хотите, или же объект наследует свойство вообще. Чтобы избежать этой проблемы (или также эта ошибка IE ), вам придется использовать Object.prototype.hasOwnProperty.call
- это уродливо.
Итак, имена, на которых распространяются все эти функции на Object
полезен, это более чистый API, который отделяет методы отражения от интерфейса приложения объекта. Это также помогает оптимизировать (упрощает статический анализ) и упрощает ограничение доступа к API отражения в песочницах - по крайней мере, это была идея дизайна .
Вы можете быть счастливы в прототипе есть defineProperty
, но вы можете безопасно использовать его только при работе с известными объектами. Если вы все еще этого хотите (как вы знаете, когда использовать, а когда нет), вы можете использовать
Object.defineProperty(Object.prototype, "defineProperty", {
writable: true,
enumberable: false,
value: function(prop, descr) {
return Object.defineProperty(this, prop, descr);
}
});
Интересно. Единственная причина, по которой я пришел, заключается в том, что людям нравится переписывать прототипы и этот метод «скрытый», подобный этому, может помочь вам избежать некоторых ошибок. Особенно из-за хорошего имени метода, поскольку это, скорее всего, будет перезаписано, чем, например, __defineGetter__
.
Кажется, что многие функции зависят от этой функциональности ( link ), поэтому имеет смысл сделать ее более глобальной и безопасной в этом контексте.
Это делается так, чтобы избежать столкновений - помните, каждый метод на Object.prototype
также является методом в каждом отдельном определяемом пользователем объекте.
Представьте объект, в котором вы хотите использовать собственный метод defineProperty
- это полностью сломает вещи, когда Object.defineProperty
был на своем прототипе.