Скрытые функции PHP? [закрытый]

Я знаю, что это походит на вопрос о распутстве точки, но позвольте мне объяснить, куда я происхожу из.

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

Затем я получил задание как индивидуальный внутренний магазин разработки в значительной корпорации, где вся работа была в C#. В моей приверженности положению я начал читать тонну блогов и книг и быстро понял, как неправильно я должен был думать, что знал все. Я узнал о поблочном тестировании, внедрении зависимости и шаблонах "декоратор", принципе разработки слабой связи, состава по дебатам наследования, и так далее и вперед и вперед - я все еще очень поглощаю все это. Само собой разумеется, мой стиль программирования изменился полностью в прошлом году.

Теперь я забираю php проект, делающий некоторое кодирование для запуска друга, и я чувствую себя абсолютно принужденным в противоположность программированию в C#. Это действительно беспокоит меня, что все переменные в объеме класса должны быть упомянуты путем добавления '$this->'. Меня раздражает, что ни один из IDE, которые я попробовал, не имеет очень хороший intellisense и что мои методы модульных тестов SimpleTest должны запустить со слова 'тест'. Это управляет мной сумасшедший, что динамический контроль типов мешает мне указывать неявно, какой тип параметра метод ожидает, и что необходимо записать оператор переключения, чтобы сделать перегрузки метода. Я не могу выдержать это, Вы не могли вложить пространства имен и должны использовать:: оператор для вызова конструктора базового класса.

Теперь у меня нет намерения запустить PHP по сравнению с дебатами C#, скорее что я означаю говорить, то, что я уверен, что существуют некоторые функции PHP, о которых я или не знаю или знаю о все же сбое для использования правильно. Я установлен в моей вселенной C# и имеющий проблему, видя вне стеклянной миски.

Таким образом, я спрашиваю, каковы Ваши любимые функции PHP? Что такое вещи, которые можно сделать в нем, что Вы не можете или быть более трудными на языках .NET?

174
задан 9 revs, 4 users 54% 16 November 2012 в 17:08
поделиться

65 ответов

Документация . документация получает мой голос. Я не встретился с более полной онлайн-документацией для языка программирования - все остальное, что я должен соединить от различных веб-сайтов и страниц справочника.

328
ответ дан 2 revs, 2 users 86% 23 November 2019 в 20:27
поделиться

Массивы . При оценке от ответов до этого вопроса, я не думаю, люди осознают, как легкие и полезные Массивы в PHP. Массивы PHP действуют как списки, карты, стеки и универсальные структуры данных все одновременно. Массивы реализованы в ядре языка и используются повсеместно, который приводит к хорошей местности кэша ЦП. Perl и Python и используют отдельные конструкции языка для списков и карт, приводящих к большему количеству копирования и потенциально запутывающих преобразований.

179
ответ дан 2 revs, 2 users 67% 23 November 2019 в 20:27
поделиться

включенный webspace PHP является обычно менее дорогим, чем что-то с (asp) .net. Вы могли бы вызов что функция;-)

44
ответ дан 2 revs, 2 users 67% 23 November 2019 в 20:27
поделиться

Один не, таким образом, известная функция PHP extract() , функция, которая распаковывает ассоциативный массив в локальное пространство имен. Это, вероятно, существует для автоглобального abormination, но очень полезно для шаблонной обработки:

function render_template($template_name, $context, $as_string=false)
{
    extract($context);
    if ($as_string)
        ob_start();
    include TEMPLATE_DIR . '/' . $template_name;
    if ($as_string)
        return ob_get_clean();
}

Теперь можно использовать render_template('index.html', array('foo' => 'bar')), и [только 113] со значением "bar" появляются в шаблоне.

61
ответ дан 4 revs, 4 users 80% 23 November 2019 в 20:27
поделиться

strtr ()

Это чрезвычайно быстро, так что Вы были бы поражены. Внутренне это, вероятно, использует некоторую сумасшедшую структуру типа B-дерева для расположения соответствий их общими префиксами. Я использую его с более чем 200, находят и заменяют строки, и это все еще проходит 1 МБ меньше чем в 100 мс. Для всех кроме тривиально маленьких строк strtr () даже значительно быстрее, чем strtolower () при выполнении той же самой вещи, даже принимая набор символов во внимание. Вы могли, вероятно, записать весь синтаксический анализатор с помощью последовательных вызовов strtr, и это будет быстрее, чем обычное соответствие регулярного выражения, выяснит тип маркера, произведет это или что, следующий вид регулярного выражения вещи.

я писал текстовый нормализатор для разделения текста в слова, печатание строчными литерами, удаляя пунктуацию и т.д. и strtr было моим швейцарским ножом, это разбило штаны от регулярных выражений или даже str_replace ().

63
ответ дан 3 revs, 2 users 93% 23 November 2019 в 20:27
поделиться

Одна хорошая функция PHP CLI. Это не так "продвинуто" в документации, но если Вам нужны стандартные сценарии / консольные приложения, с помощью крона + php cli действительно быстры для разработки!

42
ответ дан 2 revs, 2 users 67% 23 November 2019 в 20:27
поделиться

Переменные переменные и функции без сомнения!

$foo = 'bar';
$bar = 'foobar';
echo $foo;    //This outputs foobar

function bar() {
    echo 'Hello world!';
}

function foobar() {
    echo 'What a wonderful world!';
}
$foo();    //This outputs Hello world!
$foo();    //This outputs What a wonderful world!

то же понятие относится к параметрам объекта ($some_object->$some_variable);

Очень, очень хороший. Кодирование Make с циклами и очень легкими шаблонами, и это быстрее и больше под управлением, чем оценка (Спасибо @Ross & @Joshi Spawnbrood!) .t

76
ответ дан 6 revs, 2 users 97% 23 November 2019 в 20:27
поделиться

__autoload() (класс-) файлам помогают set_include_path().

В PHP5 является теперь ненужным определить длинные списки "include_once" операторов при выполнении достойного ООП.

Просто определяют маленький набор каталога, в котором файлы библиотеки классов нормально структурированы и устанавливают автоматическое, включают путь:

set_include_path(get_include_path() . PATH_SEPARATOR . '../libs/');`

Теперь __autoload() стандартная программа:

function __autoload($classname) {
    // every class is stored in a file "libs/classname.class.php"

    // note: temporary alter error_reporting to prevent WARNINGS
    // Do not suppress errors with a @ - syntax errors will fail silently!

    include_once($classname . '.class.php');
}

Теперь PHP будет автоволшебно включать необходимые файлы сохраняющее время парсинга по запросу и память.

80
ответ дан 6 revs, 5 users 76% 23 November 2019 в 20:27
поделиться

стандартный класс является аккуратным контейнером. Я только недавно узнал об этом.

Вместо того, чтобы использовать массив для содержания атрибутов serveral

$person = array();
$person['name'] = 'bob';
$person['age'] = 5;

можно использовать стандартный класс

$person = new stdClass();
$person->name = 'bob';
$person->age = 5;

, Это особенно полезно при доступе к этим переменным в строке

$string = $person['name'] . ' is ' . $person['age'] . ' years old.';
// vs
$string = "$person->name is $person->age years old.";
95
ответ дан 4 revs, 2 users 97% 23 November 2019 в 20:27
поделиться

Волшебные Методы , проваливаются методы, которые называют каждый раз, когда Вы вызываете метод, который не существует или присваивает или считать свойство, которое не существует, среди прочего.

interface AllMagicMethods {
    // accessing undefined or invisible (e.g. private) properties
    public function __get($fieldName);
    public function __set($fieldName, $value);
    public function __isset($fieldName);
    public function __unset($fieldName);

    // calling undefined or invisible (e.g. private) methods
    public function __call($funcName, $args);
    public static function __callStatic($funcName, $args); // as of PHP 5.3

    // on serialize() / unserialize()
    public function __sleep();
    public function __wakeup();

    // conversion to string (e.g. with (string) $obj, echo $obj, strlen($obj), ...)
    public function __toString();

    // calling the object like a function (e.g. $obj($arg, $arg2))
    public function __invoke($arguments, $...);

    // called on var_export()
    public static function __set_state($array);
}

разработчик C++ А здесь мог бы заметить, что PHP позволяет перегружать некоторые операторы, например, () или (string). На самом деле PHP позволяет перегружаться еще больше, например, [] оператор ( ArrayAccess), foreach конструкция языка ( Итератор и IteratorAggregate) и count функция ( Исчисляемый ).

131
ответ дан 6 revs, 4 users 64% 23 November 2019 в 20:27
поделиться

Обработчики Потоков позволяют Вам расширять "Файловую систему" с помощью логики, которую, насколько я знаю, довольно трудно сделать на большинстве других языков.

, Например, с обработчик Потоков Excel MS можно создать MS файл Excel следующим образом:

$fp = fopen("xlsfile://tmp/test.xls", "wb");
if (!is_resource($fp)) { 
    die("Cannot open excel file");
}

$data= array(
    array("Name" => "Bob Loblaw", "Age" => 50),  
    array("Name" => "Popo Jijo", "Age" => 75),  
    array("Name" => "Tiny Tim", "Age" => 90)
); 

fwrite($fp, serialize($data));
fclose($fp);
167
ответ дан 3 revs 23 November 2019 в 20:27
поделиться

Легкость . Самая большая функция - насколько легкий это для новых разработчиков, чтобы сесть и записать "рабочие" сценарии и понять код.

худшая функция - насколько легкий это для новых разработчиков, чтобы сесть и записать "рабочие" сценарии и думать, что они понимают код.

открытость сообщества окружение PHP и значительные суммы проектов PHP, доступных как открытый исходный код, являются намного менее пугающими для кого-то вводящего мир разработки и как Вы, могут быть стартовой площадкой на более зрелые языки.

я не буду обсуждать технические вещи, столько же передо мной имеет, но если Вы смотрите на PHP сколько сообщество, а не веб-язык, сообщество, которое ясно охватило Вас, когда Вы начали разрабатывать, преимущества действительно выступают за себя.

76
ответ дан 2 revs, 2 users 86% 23 November 2019 в 20:27
поделиться

Затем "и печать" прием

<?php $flag and print "Blah" ?>

повторит Вздор, если $flag будет верен. НЕ РАБОТАЕТ С ЭХОМ.

Это очень удобно в шаблоне и замене?: это не действительно легко считать.

40
ответ дан 3 revs, 3 users 84% 23 November 2019 в 20:27
поделиться

Быстрый и грязный значение по умолчанию.
язык заполнен полезными ярлыками, Это делает PHP идеальным кандидатом на (маленькие) проекты, которые имеют короткое время выхода на рынок. Не то, чтобы чистый код PHP невозможен, он просто прилагает некоторые дополнительные усилия и опыт.

, Но я люблю PHP, потому что он позволяет мне выразить то, что я хочу, не вводя эссе.

PHP:

if (preg_match("/cat/","one cat")) {
   // do something
}

JAVA:

import java.util.regex.*;
Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("one cat")
if (m.find()) {
  // do something
}

И да, который включает не ввод Интервал .

21
ответ дан 4 revs, 3 users 93% 23 November 2019 в 20:27
поделиться

Вот один, мне нравится, как значения по умолчанию установки на параметрах функции , которые не предоставляются, намного легче:

function MyMethod($VarICareAbout, $VarIDontCareAbout = 'yippie') { }
21
ответ дан 3 revs, 2 users 83% 23 November 2019 в 20:27
поделиться

Я немного похож на Вас, я кодировал PHP больше 8 лет. Я должен был взять.NET/C# курс приблизительно год назад, и я действительно наслаждался языком C# (ненавидел ASP.NET), но он сделал меня лучшим разработчиком PHP.

PHP как язык довольно плох, но, я чрезвычайно быстр с ним, и стек LAMP является потрясающим. Конечный продукт далеко перевешивает сумму частей.

Однако в ответе на Ваш вопрос:

http://uk.php.net/SPL

я люблю SPL, класс набора в C# был чем-то, что я любил, как только я запустил с него. Теперь я могу иметь свой пирог и съесть его.

Andrew

26
ответ дан 2 revs, 2 users 95% 23 November 2019 в 20:27
поделиться

управление Массивом.
Тонны инструментов для работы с и управления массивами. Это не может быть уникально для PHP, но я никогда не работал с языком, который сделал его настолько легким.

26
ответ дан MattBelanger 23 November 2019 в 20:27
поделиться

Вероятно, не многие знают, что возможно определить постоянные "переменные" как значения по умолчанию для параметров функции:

function myFunc($param1, $param2 = MY_CONST)
{
//code...
}

Строки могут использоваться в качестве , если они были массивы :

$str = 'hell o World';
echo $str; //outputs: "hell o World"

$str[0] = 'H';
echo $str; //outputs: "Hell o World"

$str[4] = null;
echo $str; //outputs: "Hello World"
34
ответ дан 2 revs, 2 users 97% 23 November 2019 в 20:27
поделиться

Можно использовать в своих интересах то, что or оператор имеет более низкий приоритет, чем = сделать это:

$page = (int) @$_GET['page'] 
  or $page = 1;

Если значение первого присвоения оценивает к true, второе присвоение проигнорировано. Другой пример:

$record = get_record($id) 
  or throw new Exception("...");
83
ответ дан 6 revs 23 November 2019 в 20:27
поделиться

Вы можете использовать минус символ в именах переменных следующим образом:

class style
{
  ....
  function set_bg_colour($c)
  {
    $this->{'background-color'} = $c;
  }
}

Зачем его использовать? Понятия не имею: может быть, для модели CSS? Или какой-то странный JSON, который вам нужно вывести. Это странная особенность :)

37
ответ дан 23 November 2019 в 20:27
поделиться

Мне нравятся удаленные файлы . Для веб-разработки такая функция исключительно полезна.

Необходимо работать с содержимым веб-страницы? Простой

$fp = fopen('http://example.com');

, и у вас есть дескриптор файла, готовый к работе, как и любой другой обычный файл.

Или как насчет чтения удаленного файла или веб-страницы непосредственно в строке?

$str = file_get_contents('http://example.com/file');

Трудно переоценить полезность этого конкретного метода.

Хотите проанализировать удаленное изображение? Как насчет того, чтобы сделать это через FTP?

$imageInfo = getimagesize('ftp://user:password@ftp.example.com/image/name.jpg');

Практически любая функция PHP, которая работает с файлами, может работать с удаленным файлом. Вы можете даже include () или require () кодировать файлы удаленно таким образом.

67
ответ дан 23 November 2019 в 20:27
поделиться

Ключевое слово static полезно вне точки зрения ООП. Вы можете быстро и легко реализовать «мемоизацию» или кеширование функций с помощью чего-то очень простого:

<?php
function foo($arg1)
{
    static $cache;

    if( !isset($cache[md5($arg1)]) )
    {
        // Do the work here
        $cache[md5($arg1)] = $results;
    }

    return $cache[md5($arg1)];
}
?>

Ключевое слово static создает переменную, которая сохраняется только в рамках этой функции после выполнения. Этот метод отлично подходит для функций, обращающихся к базе данных, таких как get_all_books_by_id (...) или get_all_categories (...) , которые вы вызываете более одного раза во время загрузки страницы.

Предостережение: Убедитесь, что вы нашли лучший способ сделать ключ для своего хэша, практически в любых обстоятельствах md5 (...) выше НЕ является хорошим решением (скорость и вывод вопросы длины), я использовал это в иллюстративных целях. sprintf ('% u', crc32 (...

42
ответ дан 23 November 2019 в 20:27
поделиться

Range () сам по себе не скрыт, но я все еще вижу, как многие люди повторяют:

for ($i=0; $i < $x; $i++) { 
    // code...
}

, хотя могли бы использовать:

foreach (range(0, 12) as $number) {
    // ...
}

И вы можете делать простые вещи, например

foreach (range(date("Y"), date("Y")+20) as $i)
{
print "\t<option value=\"{$i}\">{$i}</option>\n";
}
52
ответ дан 23 November 2019 в 20:27
поделиться

Синтаксис HEREDOC - моя любимая скрытая функция. Всегда трудно найти, так как вы не можете использовать Google для <<<, но это избавляет вас от необходимости избегать больших фрагментов HTML и по-прежнему позволяет добавлять переменные в поток.

echo <<<EOM
  <div id="someblock">
    <img src="{$file}" />
  </div>
EOM;
34
ответ дан 23 November 2019 в 20:27
поделиться

Я немного удивлен, что никто об этом еще не упомянул, но один из моих любимых приемов с массивами - это использование оператора «плюс». Это немного похоже на array_merge () , но немного проще. Я обнаружил, что обычно это то, что я хочу. Фактически, он берет все записи в RHS и заставляет их появляться в копии LHS, при необходимости перезаписывая (т. Е. Это некоммутативно). Очень полезно для начала с массива «по умолчанию» и добавления некоторых реальных значений за один прием, оставляя значения по умолчанию для значений, которые не указаны.

Запрошен образец кода:

// Set the normal defaults.
$control_defaults = array( 'type' => 'text', 'size' => 30 );

// ... many lines later ...

$control_5 = $control_defaults + array( 'name' => 'surname', 'size' => 40 );
// This is the same as:
// $control_5 = array( 'type' => 'text', 'name' => 'surname', 'size' => 40 );
24
ответ дан 23 November 2019 в 20:27
поделиться

Мой список .. большинство из них больше относится к «скрытым функциям», чем к «избранным функциям» (я надеюсь!), И не все полезны, но .. да.

// swap values. any number of vars works, obviously  
list($a, $b) = array($b, $a);

// nested list() calls "fill" variables from multidim arrays:  
$arr = array(  
  array('aaaa', 'bbb'),  
  array('cc', 'd')  
);  
list(list($a, $b), list($c, $d)) = $arr;  
echo "$a $b $c $d"; // -> aaaa bbb cc d  

// list() values to arrays  
while (list($arr1[], $arr2[], $arr3[]) = mysql_fetch_row($res)) { .. }  
// or get columns from a matrix  
foreach($data as $row) list($col_1[], $col_2[], $col_3[]) = $row;

// abusing the ternary operator to set other variables as a side effect:  
$foo = $condition ? 'Yes' . (($bar = 'right') && false) : 'No' . (($bar = 'left') && false);  
// boolean False cast to string for concatenation becomes an empty string ''.  
// you can also use list() but that's so boring ;-)  
list($foo, $bar) = $condition ? array('Yes', 'right') : array('No', 'left');

Вы также можете вкладывать тернарные операторы, иногда это может пригодиться.

// the strings' "Complex syntax" allows for *weird* stuff.  
// given $i = 3, if $custom is true, set $foo to $P['size3'], else to $C['size3']:  
$foo = ${$custom?'P':'C'}['size'.$i];  
$foo = $custom?$P['size'.$i]:$C['size'.$i]; // does the same, but it's too long ;-)  
// similarly, splitting an array $all_rows into two arrays $data0 and $data1 based  
// on some field 'active' in the sub-arrays:  
foreach ($all_rows as $row) ${'data'.($row['active']?1:0)}[] = $row;

// slight adaption from another answer here, I had to try out what else you could  
// abuse as variable names.. turns out, way too much...  
$string = 'f.> <!-? o+';  
${$string} = 'asdfasf';  
echo ${$string}; // -> 'asdfasf'  
echo $GLOBALS['f.> <!-? o+']; // -> 'asdfasf'  
// (don't do this. srsly.)

${''} = 456;  
echo ${''}; // -> 456  
echo $GLOBALS['']; // -> 456  
// I have no idea.  

Ладно, я остановлюсь сейчас: -)


Хм, давно прошло ..

// just discovered you can comment the hell out of php:
$q/* snarf */=/* quux */$_GET/* foo */[/* bar */'q'/* bazz */]/* yadda */;

Итак, только что обнаружил, что можно передавать любая строка в качестве имени метода, ЕСЛИ вы заключите ее в фигурные скобки. Увы, вы не можете определить какую-либо строку как метод, но вы можете поймать их с помощью __call () и обработать их по мере необходимости. Хммм ....

class foo {
  function __call($func, $args) {
    eval ($func);
  }
}

$x = new foo;
$x->{'foreach(range(1, 10) as $i) {echo $i."\n";}'}();

Нашел эту маленькую жемчужину в комментариях Reddit:

$foo = 'abcde';
$strlen = 'strlen';
echo "$foo is {$strlen($foo)} characters long."; // "abcde is 5 characters long."

Вы не можете напрямую вызывать функции внутри {}, но вы можете использовать переменные-удерживающие-функции- назовите и назовите тех! (* и * вы также можете использовать в нем переменные)

29
ответ дан 23 November 2019 в 20:27
поделиться

Быстрые комментарии блока

/*
    die('You shall not pass!');
//*/


//*
    die('You shall not pass!');
//*/

Эти комментарии позволяют вам переключаться, если блок кода комментируется одним символом.

30
ответ дан 23 November 2019 в 20:27
поделиться

Самая полезная вещь в PHP-коде заключается в том, что если я не совсем понимаю функцию, которую вижу, я могу найти ее, используя браузер и набрав:

http://php.net/function

В прошлом месяце я видел функцию "диапазон" в каком-то коде. Это одна из сотен функций, которые мне никогда не удавалось использовать, но они оказались действительно полезными:

http://php.net/range

Этот URL является псевдонимом для http: // us2.php.net/manual/en/function.range.php. Эта простая идея сопоставления функций и ключевых слов с URL-адресами прекрасна.

Я хочу, чтобы другие языки, фреймворки, базы данных и операционные системы имели такой же простой механизм для поиска документации.

33
ответ дан 23 November 2019 в 20:27
поделиться

Вы можете использовать функции с неопределенным числом аргументов , используя func_get_args () .

<?php

function test() {

    $args = func_get_args();
    echo $args[2]; // will print 'd'
    echo $args[1]; // will print 3
}

test(1,3,'d',4);

?>
68
ответ дан 23 November 2019 в 20:27
поделиться

Включаемые файлы могут иметь возвращаемое значение , которое можно присвоить переменной.

// config.php
return array(
    'db' => array(
        'host' => 'example.org',
        'user' => 'usr',
        // ...
    ),
    // ...
);

// index.php
$config = include 'config.php';
echo $config['db']['host']; // example.org
90
ответ дан 23 November 2019 в 20:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: