Скрытые особенности PHP?

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

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

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

Теперь я нахожу, что собираю проект php, который делает некоторую кодировку для запуска друга, и я чувствую себя полностью ограниченным, а не программированием на С#. Меня действительно беспокоит, что все переменные в области класса следует называть добавлением "$ this- > ". Меня раздражает, что ни одна из IDE, которую я пробовал, не имеет очень хорошего интеллекта и что мои методы тестирования модульных тестов SimpleTest должны начинаться со слова "тест". Это сводит меня с ума, что динамическая типизация не позволяет мне неявно указывать тип параметра, который ожидает метод, и что вам нужно написать оператор switch для перегрузки методов. Я не могу поверить, что вы не можете иметь вложенные пространства имен и должны использовать оператор:: для вызова конструктора базового класса.

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

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

Ответ 1

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

Ответ 2

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

Ответ 3

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

Например, с помощью обработчик потока MS-Excel вы можете создать файл 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);

Ответ 4

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

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

Разработчик С++ здесь может заметить, что PHP позволяет перегружать некоторые операторы, например. () или (string). На самом деле PHP позволяет перегружать еще больше, например, оператор [] (ArrayAccess), конструкцию языка foreach (Iterator и IteratorAggregate) и count function (Countable).

Ответ 5

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

Вместо использования массива для хранения атрибутов сервера

$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.";

Ответ 6

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

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

// index.php
$config = include 'config.php';
echo $config['db']['host']; // example.org

Ответ 7

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

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

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

$record = get_record($id) 
  or throw new Exception("...");

Ответ 8

__autoload() (class-) файлы с помощью 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 автоматически включат необходимые файлы по требованию, сохраняя время разбора и память.

Ответ 9

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

$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);

Очень, очень приятно. Сделать кодирование с петлями и шаблонами очень легко, и это быстрее и больше под контролем, чем eval (Thanx @Ross и @Joshi Spawnbrood!). T

Ответ 10

Лёгкость. Самая большая особенность заключается в том, как легко новым разработчикам сесть и написать "рабочие" скрипты и понять код.

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

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

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

Ответ 11

Вы можете использовать функции с числом аргументов undefined с помощью 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);

?>

Ответ 12

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

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

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

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

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

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

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

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

$imageInfo = getimagesize('ftp://user:[email protected]/image/name.jpg');

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

Ответ 13

strtr()

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

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

Ответ 14

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

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')), и в шаблоне появится только $foo со значением "bar".

Ответ 15

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";
}

Ответ 16

Веб-пространство с поддержкой PHP обычно дешевле чем-то с (asp).net. Вы можете вызывать эту функцию; -)

Ответ 17

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

Ответ 18

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

<?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(...)) или spl_object_hash(...) может быть намного лучше в зависимости от контекста.

Ответ 19

Затем "и распечатать" трюк

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

Будет эхо Blah, если флаг $true. НЕ РАБОТАЕТ С ECHO.

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

Ответ 20

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

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

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

Ответ 21

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

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"

Ответ 22

Синтаксис

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

echo <<<EOM
  <div id="someblock">
    <img src="{$file}" />
  </div>
EOM;

Ответ 23

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

http://php.net/function

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

http://php.net/range

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

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

Ответ 24

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

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


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

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

Ответ 25

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

// 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 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 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."

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

Ответ 26

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

Ответ 27

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

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

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

http://uk.php.net/SPL

Мне нравится SPL, класс коллекции в С# был тем, что мне понравилось, как только я начал с него. Теперь я могу взять пирог и съесть его.

Эндрю

Ответ 28

Я немного удивлен, что никто не упомянул об этом, но один из моих любимых трюков с массивами - это использование оператора "плюс". Это немного похоже на 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 );

Ответ 29

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

function MyMethod($VarICareAbout, $VarIDontCareAbout = 'yippie') { }

Ответ 30

Быстрая и грязная по умолчанию.
Язык заполнен полезными ярлыками, что делает 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
}

И да, это включает в себя не набирать Int.