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

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
174
задан 9 revs, 4 users 54% 16 November 2012 в 17:08
поделиться

78 ответов

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

я пытаюсь изучить Python теперь (для выращивания как... хорошо.. программист, который может быть?) и самой полезной вещью Python является добавление отступа. Я люблю добавление отступа PHP, метку $ знака переменные, фигурные скобки для циклов и циклов, ну, в общем, те умные вещи сохраняют мой код очень легким понять (даже если тот, который, написал код, был мало.. грязный.. 'запутанный код', mh?)

Массивы , в PHP довольно просты и мощны.

Базы данных : MySQL, Postrgee, sql; можно использовать почти каждый вид баз данных.. легко.

Быстрый: логически зависит тем, как код, записал, но обычно PHP симпатичен быстро для маленького/среднего приложения (поскольку это теряет колесо в большем приложении).

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

определение неявно, которое тип параметра метод ожидает

На самом деле, этот частично возможен (по крайней мере, в PHP5) - можно определить тип для параметров массива и параметры объекта для функций и методов, хотя Вы являетесь неудачливыми в случае скалярных типов.

class Bar
{
    public function __construct(array $Parameters, Bar $AnotherBar){}
}

Кроме этого и волшебных методов Allain упомянул, я также нахожу интерфейсы обеспеченными SPL (Стандартная библиотека PHP) необходимый - можно реализовать необходимые методы в классе, например, мне особенно нравятся интерфейсы ArrayAccess и Итератора, которые позволяют использовать объект как ассоциативный массив или выполнять итерации по нему точно так же, как любой простой массив.

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

Как чрезвычайно легкий должен найти, что PHP связал вещи Примеры, Приложения, Классы, Документация, Платформы, и т.д.

На всем протяжении сети, это - самый легкий язык для изучения при движении коммандос (собой), и также тот с большим количеством значения в течение Вашего времени.

После изучения PHP мог бы поместить CMS с joomla, блог с Wordpress, и т.д.

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

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

я не сказал бы, что язык имеет много уничтожающих функций. (По крайней мере, я не нахожу, что много случая ищет их.) Мне нравится этот, язык незаметен.

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

Созданный в фильтрах для парсинга переменных против определенных предварительно определенных типов - а также покрытие основ (интервал/плавание и т.д.), расширяется на покрытие электронных писем, URL и даже если переменная является действительным регулярным выражением.

http://ch2.php.net/manual/en/book.filter.php

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

функции Даты . Я должен обработать большую информацию времени и строки даты целый день, так функции как strftime () и , strtotime () являются просто потрясающими.

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

a) руководство - чрезвычайно всесторонний, актуальный и просто огромный источник для вдохновения, в то время как решение проблем - застрявший? просматривайте/ищите руководство, оно прибудет к Вам

массивы b) - они являются пластмассовыми, они ассоциативно индексируются, они могут быть легко вложены (!) для составления некоторых диких структур данных, и существует множество функций только для одних только операций над массивом. О, и я упоминал, что рассматривал отдельные переменные как массив значений?

оценка c) () и подобные конструкции (как динамическая переменная и имена функций), которые допускают намного большую гибкость (и все еще относительно безопасны, если Вы знаете то, что Вы делаете) - ничто не бьет программу, которая в основном определяет ее собственный технологический маршрут (или даже определенное выполнение) на лету

d) по всей вероятности самая легкая вещь пропустить: поскольку почти все в механизме ЗЕНДА zVal (который в сущности является набором ссылок указателя), способность возвратиться о чем-либо как функциональное возвращаемое значение


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

e) простота записи расширения C (главным образом интерфейсы для других объектов как OpenAL или SDL) - большая структура исходного кода и почти столько же мощных инструментов на 'внутренней части' сколько существует на 'внешней стороне' - если когда-нибудь необходимо разворачивать функциональность просто это немного далее.

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

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

function foo ( array $param0, stdClass $param1 );

Примечание: Это только работает на 'массив' и имена объектов.

И так далее, и можно даже передать в собственных классах как ожидаемые параметры. Вызов методов/функций с чем-то еще приведет к фатальной ошибке.

Другая подсказка о хорошем intellisense в PHP. Мы используем ZendStudio, и он будет на самом деле работать намного лучше, если Вы запишете хороший PHPDocs для своих методов, он изучит тех при выводе подсказок.

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

Вы можете легко добавить элемент в массив.

$my_array = array();
$my_array[] = 'first element';
$my_array[] = 'second element';

Элемент может быть любым: объект, массив, скаляр ...

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

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

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

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

Также, когда вы создаете объект ArrayAccess, устанавливая флаг в конструкторе, вы можете читать и записывать объект как массив или объект. Вот пример:

$obj = new ArrayObject(array("name"=>"bob", "email"=>"bob@example.com"),2);
$obj->fullname = "Bob Example";
echo $obj["fullname"];
$obj["fullname"]="Bobby Example";
echo $obj->fullname;
4
ответ дан 23 November 2019 в 20:27
поделиться

Мне также нравится разница между 'и ".

$foo = 'Bob';
echo 'My name is {$foo}'; // Doesn't swap the variable
echo "My name is {$foo}"; // Swaps the variable

Поэтому, если ваша строка не требует перестановки переменных, не используйте", это пустая трата времени. Я вижу, как многие люди объявляют строки с помощью "все время.

Примечание: я использую {}, потому что это делает мои переменные более заметными.

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

preg_split (), array_intersect () и array_intersect_key ().

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

Давайте посмотрим ...

  1. Тернарные операторы. Они творит чудеса, обрабатывая флажки в результатах формы.

    $ var = ($ _POST ['my_checkbox'] == 'проверено')? TRUE: FALSE;

  2. Стоит изучить все замечательные функции обработки строк и массивов. strtotime (), strlen () и strpos () - некоторые из моих любимых.

  3. Класс SimpleXML и функция json_decode (). Вызовите REST API или RSS-канал с помощью file_get_contents (), без труда проанализируйте его с помощью одного из этих инструментов, и все готово.

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

Подавление ошибок с помощью оператора управления ошибками , @ почти никогда не должно использоваться. Он продвигает ленивые и небезопасные методы кодирования, просто игнорируя ошибки, создает кошмары отладки, поскольку ошибки всех типов - даже фатальные - будут подавлены, а в некоторых случаях могут снизить производительность (особенно при подавлении больших количество ошибок).

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

Помимо мгновенного доступа для начала кодирования всего, что вам нужно для веб-сайта?

Помимо магических методов и отражений, есть некоторые интересные функции:

  1. сериализация / unserialize - состояние сохранения совершенства через sql, куки, процессы, плоский файл. хороший материал.
  2. json_encode / json_decode - мгновенное развлечение AJAX
  3. get_class - полезно для тех утомительных моментов, когда набирают текст
  4. call_user_func_array - мощно, когда вы можете работать со своим кодом в виде строк (думать динамически)
  5. method_exists - отражение
  6. func_num_arg s / func_get_arg - неизвестные аргументы ftw
  7. set_error_handler / set_exception_handler - очень хорошие возможности отладки для языка сценариев
13
ответ дан 23 November 2019 в 20:27
поделиться

Что ж, недавно я доставил свое первое приложение с графическим интерфейсом пользователя платному покупателю, написанное на PHP! Он собирает данные со считывателя штрих-кода или кнопок графического интерфейса, флажков, переключателей или текстовых полей, сохраняет в SQLite или удаленном MySQL, запускает другие приложения Windows, отправляет заархивированные отчеты XML в виде вложений электронной почты, шифрует и дешифрует сохраненные данные и даже воспроизводит звук. по завершении.

Сделал это с miniPHP и Winbinder . Это достаточно скрыто? Думаю, не многие PHP-разработчики действительно пробовали это.

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

Буферизация вывода с помощью ob_start () гораздо более полезна, чем многие думают. Первая скрытая функция здесь заключается в том, что ob_start принимает обратный вызов:

function twiterize($text) {
    // Replace @somename with the full twitter handle
    return preg_replace("(\s+)@(\w)+(\s+)", "http://www.twitter.com/${2}", $text);
}

ob_start(twiterize);

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

ob_start(parseTemplate);
 // ... 
 ob_start(twiterize);
   // ...
 ob_end_flush();
 // ... 
ob_end_flush();

Содержимое справки, текстовые объявления, функции словаря / индекса, связывание, перенаправление ссылок для отслеживание целей, механизм шаблонов, все это очень просто, если использовать различные комбинации этих двух вещей.

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

Альтернативный синтаксис для управляющих структур

Многие люди не знают этот синтаксис. Когда я использую чистый PHP для создания шаблонов, этот синтаксис предлагает удобный и понятный способ смешивать простые управляющие структуры, такие как if или foreach , с кодом вашего HTML-шаблона, обычно в сочетании с ] короткий стиль печати переменной.

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

Использование элементов массива или свойств объекта внутри строк.

Вместо записи

$newVar = $ar['foo']['bar'];
echo "Array value is $newVar";

$newVar = $obj->foo->bar;
echo "Object value is $newVar";

Вы можете написать:

echo "Array value is {$ar['foo']['bar']}";
echo "Object value is {$obj->foo->bar}";
6
ответ дан 23 November 2019 в 20:27
поделиться

Функции Ctype быстрее, чем preg_match () для проверки основных символов.

ctype_alnum () - Проверить наличие буквенно-цифровых символов
ctype_alpha () - Проверить наличие буквенных символов
ctype_cntrl () - Проверить наличие управляющих символов
ctype_digit () - Проверить наличие числовых символов
... и т.д ...

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

Я начал переходить на python, и одна вещь, которая мне нравилась в python, - это живой интерпретатор. Только позже, когда я работал над проектом php, я понял, что в php есть эта опция, но она не так широко известна. В командной строке введите php -a и вставьте любой код php, который хотите протестировать, но не забудьте запустить его с

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

функция_фильтра . Не скрытая жемчужина, но довольно новая.

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

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

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

Что касается магических методов, то только __invoke () имеет большое значение, но в нем нет обратный метод для него, даже в этом случае, в сочетании с array_map, array_reduce и array_filter, и некоторыми оболочками, вы можете выполнять удивительное функциональное программирование.

__ get, __set и __call также действительно удобны, Я использовал эти и некоторые хитрости в соглашениях об именах интерфейсов / классов для реализации трейтов до версии 5.3, но теперь у вас есть и трейты.

Также взгляните на библиотеку дополнений, написанную Дериком Ретансом из ezComponents, и известностью XDebug, он позволяет делать аннотации для php 5+. Это неплохо, и производительность не является проблемой для кеширования.

Для профилирования вы можете использовать xdebug + webcachegrind.

Лучшей IDE, вероятно, является бесплатная eclipse PDT, если вы используете подсказку типа для параметров и phpdoc комментарии к параметрам и возвращаемые данные могут понять из них и предоставить вам завершение кода. Это должно дать вам приличный интеллект.

Кстати, заманчиво делать всевозможные сумасшедшие конкатенации строк, или переменные переменные, или вызовы методов переменных, или создание классов переменных, делать это более чем в одном месте, что ' плохо документированы, их легко искать с помощью регулярных выражений, а вы ВИНТОВЫЙ. Забудьте об отладке, но рефакторинг - это большая проблема. Это то, о чем люди редко думают, что в php НЕТ автоматических инструментов рефакторинга, а рефакторинг больших баз кода ОЧЕНЬ сложно выполнить на php.

Несколько вещей, которые должны вас предостеречь, даже если вы чувствуете малейшую вероятность того, что вам, возможно, придется Имея дело с многобайтовыми символами или «экзотическими» кодировками символов, я настоятельно рекомендую вам завершить обработку строк. Фактически, введение тонкого слоя косвенного обращения, который позволяет вам перемещаться между или действовать как швы для тестирования / внедрения между вашим кодом и встроенными модулями, облегчит вашу жизнь. Не обязательно, но если у вас нет предвидения, трудно справиться с интернационализацией или такими крупными сквозными проектами.

autoload, узнать и полюбить это. Убегайте от жестко запрограммированных требований / включает или, что еще хуже, их вариантов * _once, они связывают вам руки с точки зрения инъекции, вместо этого используйте автозагрузчик, проще всего заглушить все ваши включения в массив, привязать к имени класса и значение - путь к файлу от некоторого корня, это быстро. Самое плохое в этом то, что это делает тестирование действительно простым, поскольку вы реализовали загрузчик классов и поэтому можете делать с ним действительно полезные вещи.

В PHP 5.3 теперь есть пространства имен, прыгайте от радости и используйте их как сумасшедший. Одно это дает возможность создавать стыки (редко) для тестирования / инъекций.

Кеши кодов операций, доступ к файлам медленный, чтобы их избежать, используйте кеш кодов операций, это не просто доступ к файлу, это весь анализ, на самом деле. Если вам не нужно анализировать запрос PER, это имеет БОЛЬШОЕ значение. Даже выполнение этого для фронтального контроллера / перехватчика даст вам много преимуществ.

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

Phing / Ant / PHPMaven на раннем этапе кажется легким просто заткнуть все, но сценарии сборки по-прежнему полезны в php, и у них есть отличная поддержка.

У меня были проблемы с перегрузкой метода, и все еще бороться с этим. Я придумал шаблон, чтобы смягчить определенный аспект этого. У меня часто было много вещей, которые могли бы соответствовать определенному параметру, поэтому, когда вы документируете его @param mixed (int | array | fooObject), если бы это были возможности, я создал статический метод под названием Caster :: CastTo ($ param, $ toTypeAsString), который просто перебирает регистр, соответствующий типу, и пытается преобразовать его в известный тип. Остальная часть метода может затем предположить, что один тип или сбой при преобразовании, и работать с этим. И так как я заглушил ВСЕ преобразования в одном классе, отображение типов перестало быть сквозной проблемой, и, поскольку эти функции можно тестировать индивидуально, я мог протестировать их один раз и полагаться на них везде.

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

Класс ReflectionClass предоставляет информацию о данном классе.

$classInfo = new ReflectionClass ('MyClass');
if ($classInfo->hasMethod($methodName))                                     
{
  $cm = $classInfo->getMethod($name);                                   
  $methodResult = $cm->invoke(null);
}

Среди прочего, полезно проверить, существует ли метод и вызвать его.

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

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

#!/usr/bin/php5
<?php
// start coding here

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

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

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

]Я думаю, что их надлежащее уважение к функции GOTO является ключевым.[

] [

][]http://us2.php.net/goto[][

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

Почти любой тип файла может быть включен , от .html до .jpeg. Любая байтовая строка, найденная внутри связанных открытых тегов PHP, будет выполнена. Да, образ goat.se может содержать все ваши обычные служебные функции. Я предполагаю, что внутреннее поведение include заключается в преобразовании входного файла в строку и синтаксическом анализе любого кода PHP.

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

Сокращенные логические цепочки

<?php

TRUE AND print 'Hello';
FALSE OR print 'World';

// Prints "Hello World";

// Complex example...
User::logged_in() or die('Not allowed');
User::is_admin() AND print 'Admin Area';

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

<?php defined('YOURCONSTANT') or die('Not allowed');

///rest of your code
8
ответ дан 23 November 2019 в 20:27
поделиться

Вы можете использовать break N ; для выхода из вложенных циклов (чтобы компенсировать отсутствие goto ). Например

for (int i=0; i<100; i++) {
    foreach ($myarr as $item) {
        if ($item['name'] == 'abort')
            break 2;
    }
}

Подробнее здесь - http://php.net/manual/en/control-structures.break.php

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