С некоторыми изменениями вы можете использовать любой пользовательский класс в качестве вспомогательного компонента. Вы должны использовать операторы namespace
и use
для имеющегося у вас класса, см. Ниже
<?php
namespace app\components;
class Response
{
/**
* @var array
*/
private static $response = array
(
'9999' => array('description' => "Unexpected Response", 'definite' => true, 'status' => "Indeterminate"),
'00' => array('description' => "Success", 'definite' => true, 'status' => "Success"),
'NNC_AUTH_01' => array('description' => /*"Status unknown, please wait for settlement report"*/"System Error", 'definite' => true, 'status' => "Failure"),
'NNC_VTU_01' => array('description' => "Ttimed out", 'definite' => false, 'status' => "Indeterminate"),
'NNC_VTU_02' => array('description' => "Exceeded max number of requests for Phone number per time period", 'definite' => true, 'status' => "Failure"),
'NNC_VTU_03' => array('description' => "Invalid target MSISDN supplied", 'definite' => true, 'status' => "Failure"),
'-1' => array('description' => "Not successful", 'definite' => false, 'status' => "Failure")
);
/**
* @param $respCode
*/
public static function getResponseByCode($respCode)
{
if (isset(self::$response[$respCode])) {
return self::$response[$respCode];
}
return self::$response['9999'];
}
}
Сохраните класс Above в файле с именем Response.php
в папке app\components
, если используете [ 115] или common\components
, если вы используете advanced-app
, но не забудьте изменить namespace
в коде.
Затем можно вызвать функцию getResponseByCode()
как app\components\Response::getResponseByCode($responseCode)
или common\components\Response::getResponseByCode($responseCode)
Я не уверен, рассчитывает ли это, но потребность скомпилировать Сценарии PHP является огромной проблемой производительности. В любом серьезном проекте PHP Вам нужен некоторый кэш компилятора как APC, eAccelerator, Акселератор PHP , или (реклама) Платформа Зенда .
в самом начале каждый мог, провел много времени, отладив такой код:
$a = 1;
echo $a; # 1
echo "$a"; # 1
echo '$a'; # $a
проклятые кавычки! очень печальный :(
Просто мысль о еще одном удивлении. array_map, который применяет обратный вызов к массиву, является серьезным уничтожителем производительности. Я не полностью уверен, почему, но я думаю, что это имеет некоторое отношение к копии PHP на механизме записи для циклов.
Другая ловушка в PHP, я видел эту ошибку от людей, которые происходят из других языков, но не часто.
<?php
/**
* regular
*/
echo (true && true); // 1
echo (true && false); // nothing
echo (true || false); // 1
echo (false || false); // nothing
echo (true xor false); // 1
echo (false xor false); // nothing
/**
* bitwise
*/
echo (true & true); // 1
echo (true & false); // 0
echo (true | false); // 1
echo (false | false); // 0
echo (true ^ false); // 1
echo (false ^ false); // 0
?>
Проблемами производительности с приложениями PHP обычно является одно из следующего:
, довольно редко столкнуться с проблемами производительности с PHP (или любое веб-приложение, записанное на любом языке). Вышеупомянутыми проблемами обычно являются порядки величины медленнее, чем выполнение кода.
Как всегда, представьте свой код!
Общая память при выполнении PHP. Много крупных проектов просто включают все файлы класса и используют их, когда им нужны они. Это добавляет к общей памяти, которую PHP должен использовать для каждого выполнения.
Также проекты с помощью Кадров или IFrames, поскольку это могло легко удвоить использование памяти.
Так используют условную загрузку Ваших файлов класса, ничего не имеют, загрузил это, Вы не используете
Если Вы привыкнете к языкам с интеллектуальными логическими операторами, то Вы попытаетесь сделать вещи как:
$iShouldTalkTo = $thisObj || $thatObj;
В PHP, $iShouldTalkTo
теперь булево значение. Вы вынуждены записать:
$iShouldTalkTo = $thisObj ? $thisObj : $thatObj;
Из всех примеров того, как ранние проектные решения в PHP пытались содержать руки некомпетентных программистов в обмен на создание помех компетентным, которые могут быть тем, который раздражает меня больше всего.
Глубокое повреждение мозга в эти switch()
конструкция имеется в большом количестве. Рассмотрите это:
switch($someVal) {
case true :
doSomething();
break;
case 20 :
doSomethingElse();
break;
}
Оказывается, что doSomethingElse()
никогда не будет называться, потому что 'случай, верный', поглотит весь истинные случаи $someVal.
Думают, что это допустимо, возможно? Ну, попробуйте этого:
for($ix = 0; $ix < 10; $ix++) {
switch($ix) {
case 3 :
continue;
default :
echo ':';
}
echo $ix;
}
Предположение, каков его вывод? Должен быть:0:1:2:4:5:6:7:8:9, правильно? Нет, это-:0:1:23:4:5:6:7:8:9. Таким образом, это игнорирует семантику из continue
оператор и рассматривает его как break
.
Мой любимый глюк PHP:
Полагают, что это включает:
# ... lots of code ...
$i = 42;
# ... more code ...
Затем использование это включает где-нибудь:
for($i = 0; $i < 10; $i++){
# ...
include 'that_other_file.php';
}
Затем попытка предположить, сколько раз выполняет цикл. Да, однажды. Лексический обзор (и надлежащий динамический обзор) являются оба решенными проблемами. Но не в PHP.
Большой глюк, которого я видел, что люди становятся жертвой, является точностью (в php и других языках).
, Если Вы хотите немного забавы, сравнивают любое плавание с целым с> = и узнают, сколько раз Вы получаете ожидаемый результат.
Это было крушением многих людей, работающих с деньгами в PHP и пытающихся принять логические решения на основе сравнений, которые не позволяют округляться к целому числу.
, Например - матрица
Матрица продается в единицах 1 ярда или 1 половине двора, а также поддержания материально-технических ресурсов точного измерения, оставленного матрицы.
, Если этой системы не выражают в целых числах и вместо этого выражают в плавающих точках, она сделает его невероятно трудно для создания тела decisons.
Ваш лучший выбор состоит в том, чтобы выразить 1 половину двора как 1, например, если бы у Вас есть 300 ярдов матрицы, у Вас были бы материально-технические ресурсы 600 (600 половин единиц двора).
Так или иначе, это - мой глюк - время для рефакторинга 4 месяцев программирования из-за не понимания точности....
@
ошибочного глушителя нужно всегда избегать.
пример:
// Don't let the user see an error if this unimportant header file is missing:
@include 'header.inc.php';
С кодом выше, Вы никогда не будете знать ни о каких ошибках ни в одном коде в header.inc.php
или любой из функций, вызванных от header.inc.php
, и если будет Фатальная ошибка где-нибудь, то Ваша веб-страница остановится без способа узнать, какова ошибка была.
Не быть знающим приоритет оператора может вызвать некоторые проблемы:
if ($foo = getSomeValue() && $bar) {
// …
}
// equals
if ($foo = (getSomeValue() && $bar)) {
// …
}
__autoload()
оказался главной миной для меня недавно. Часть нашего унаследованного кода и использования библиотек class_exists()
, и это пытается автоматически загрузить классы, которые никогда не предназначались, чтобы быть загруженными таким образом. Много фатальных ошибок и предупреждений. class_exists()
может все еще использоваться, если у Вас есть автозагрузка, но второй параметр (новый начиная с PHP 5.2.0) должен быть установлен на false
Это было довольно очевидно после факта, но известный глюк имеет отношение к объему и ссылкам при использовании в foreach.
foreach($myArray as &$element){
//do something to the element here... maybe trim or something more complicated
}
//Multiple lines or immediately after the loop
$element = $foobar;
последняя ячейка в Вашем массиве теперь стала $foobar, потому что ссылка в foreach выше находится все еще в текущем объеме контекста.
foreach () тихо копирует массив в фоновом режиме и выполняет итерации через ту копию. Если у Вас будет большой массив, то это ухудшит производительность. В тех случаях, опциях ссылкой foreach (), которые в новинку для php5 или используют для () цикл.
знать о равенстве (==) по сравнению с идентификационными данными (== =).
знать, что составляет пустой () по сравнению с тем, что составляет isset ().
if (0.1 + 0.2 == 0.3) echo "equal"; else echo "nope"; // <-- ding ding
if (0111 == 111) echo "equal"; else echo "nope"; // <-- ding ding
ПУСТОЙ УКАЗАТЕЛЬ и эти "0" строка является чистым злом в Php
if ("0" == false) //true
if ("0" == NULL) //true
if ("0" == "NULL")//true
Рекурсивные ссылки пропускают память
, Если Вы создадите два объекта и сохраните их в свойствах друг друга, то сборщик "мусора" никогда не будет касаться их:
$a = new stdClass;
$b = new stdClass;
$a->b = $b;
$b->a = $a;
Это на самом деле довольно легко сделать, когда большой класс создает маленький объект помощника, который обычно хранит основной класс:
// GC will never clean up any instance of Big.
class Big {
function __construct() {
$this->helper = new LittleHelper($this);
}
}
class LittleHelper {
function __construct(Big $big) {
$this->big = $big;
}
}
Целый PHP предназначен для коротких быстрых запросов страницы, они вряд ли устранят эту проблему. Это означает, что PHP не может зависеться от для демонов или других приложений, которые имеют длинную продолжительность жизни.
require_once и include_once могут часто приводить к главным уничтожителям производительности при чрезмерном использовании. Если Ваш включать/требовать файл, который содержит класс... шаблон как так может сохранить некоторое серьезное время обработки.
class_exists("myFoo") or require("myFoo.someClass.php");
Обновление: Это - все еще проблема - http://www.techyouruniverse.com/software/php-performance-tip-require-versus-require_once
Обновление: Прочитайте выбранный ответ для следующего вопроса: производительность перенесла бы автозагрузку использования в php и поиск файла класса? , Если реализовано вдоль этих строк, Вы в значительной степени минимизируете максимально лучше всего, штрафы за файл включают/требуют.
Забавная мина: Глобальные переменные могут влиять $_SESSION
когда register_globals
идет. Но я предполагаю, что это - то, что происходит, когда register_globals, сама мина, включен.
Не получая сообщений компилятора для ветвей if/else:
if( $foo )
{
some_function();
}
else
{
non_existing_function(); // oops!
}
PHP не упомянет, что non_existing_function
не существует, пока вы не попадете в ситуацию, когда $foo
будет false.
Забываете установить:
error_reporting( E_ALL );
Поэтому уведомления не отлавливаются, тратя время на отладку:
Вставляете вместе строки разных "типов" / источников, не экранируя их:
// missing mysql_real_escape_string() or an int cast !
$sql = "SELECT * FROM persons WHERE id=$id";
// missing htmlentities() and urlencode() !
$html = "<a href='?page=$id'>$text</a>";
Согласно Почему вызов функции (такой как strlen, count и т. Д.) Для указанного значения такой медленный?
Если вы передаете переменную в функцию по ссылке, а затем вызвать на нем функцию, это невероятно медленно.
Если вы перебираете вызов функции и переменная имеет большой размер, это может быть на много порядков медленнее, чем если бы переменная передавалась по значению.
Пример:
<?php
function TestCount(&$aArray)
{
$aArray = range(0, 100000);
$fStartTime = microtime(true);
for ($iIter = 0; $iIter < 1000; $iIter++)
{
$iCount = count($aArray);
}
$fTaken = microtime(true) - $fStartTime;
print "took $fTaken seconds\n";
}
$aArray = array();
TestCount($aArray);
?>
Это постоянно занимает около 20 секунд на моей машине (на PHP 5.3).
Но если я изменю функцию для передачи по значению (например, function TestCount ($ aArray)
вместо function TestCount (& $ aArray)
), то она будет выполняться примерно за 2 мс. - буквально в 10 000 раз быстрее !
То же самое верно для любой функции, которая передает значение - как для встроенных функций, таких как strlen
, так и для пользовательских функций.
Это довольно страшный брезент, о котором я раньше не подозревал!
К счастью, есть простой обходной путь, применимый во многих случаях - используйте временную локальную переменную внутри цикла и скопируйте ее в ссылочную переменную в конце.