Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Ну, сообщество во-первых для меня. Независимо от того, что может Ваша проблема быть, Вы будете всегда находить кого-то, у кого была она прежде и почти каждый раз решение..., и иногда я видел абсолютно свободную акцию идей, способы приблизиться к единственной проблеме.
я пытаюсь изучить Python теперь (для выращивания как... хорошо.. программист, который может быть?) и самой полезной вещью Python является добавление отступа. Я люблю добавление отступа PHP, метку $ знака переменные, фигурные скобки для циклов и циклов, ну, в общем, те умные вещи сохраняют мой код очень легким понять (даже если тот, который, написал код, был мало.. грязный.. 'запутанный код', mh?)
Массивы , в PHP довольно просты и мощны.
Базы данных : MySQL, Postrgee, sql; можно использовать почти каждый вид баз данных.. легко.
Быстрый: логически зависит тем, как код, записал, но обычно PHP симпатичен быстро для маленького/среднего приложения (поскольку это теряет колесо в большем приложении).
определение неявно, которое тип параметра метод ожидает
На самом деле, этот частично возможен (по крайней мере, в PHP5) - можно определить тип для параметров массива и параметры объекта для функций и методов, хотя Вы являетесь неудачливыми в случае скалярных типов.
class Bar
{
public function __construct(array $Parameters, Bar $AnotherBar){}
}
Кроме этого и волшебных методов Allain упомянул, я также нахожу интерфейсы обеспеченными SPL (Стандартная библиотека PHP) необходимый - можно реализовать необходимые методы в классе, например, мне особенно нравятся интерфейсы ArrayAccess и Итератора, которые позволяют использовать объект как ассоциативный массив или выполнять итерации по нему точно так же, как любой простой массив.
Как чрезвычайно легкий должен найти, что PHP связал вещи Примеры, Приложения, Классы, Документация, Платформы, и т.д.
На всем протяжении сети, это - самый легкий язык для изучения при движении коммандос (собой), и также тот с большим количеством значения в течение Вашего времени.
После изучения PHP мог бы поместить CMS с joomla, блог с Wordpress, и т.д.
Преобразование типа и ctype_ * функции становятся важными для обеспечения достоверных данных. Я сделал широкое применение исключения в последнее время, который значительно упростил мой код обработки ошибок.
я не сказал бы, что язык имеет много уничтожающих функций. (По крайней мере, я не нахожу, что много случая ищет их.) Мне нравится этот, язык незаметен.
Созданный в фильтрах для парсинга переменных против определенных предварительно определенных типов - а также покрытие основ (интервал/плавание и т.д.), расширяется на покрытие электронных писем, URL и даже если переменная является действительным регулярным выражением.
функции Даты . Я должен обработать большую информацию времени и строки даты целый день, так функции как strftime () и , strtotime () являются просто потрясающими.
a) руководство - чрезвычайно всесторонний, актуальный и просто огромный источник для вдохновения, в то время как решение проблем - застрявший? просматривайте/ищите руководство, оно прибудет к Вам
массивы b) - они являются пластмассовыми, они ассоциативно индексируются, они могут быть легко вложены (!) для составления некоторых диких структур данных, и существует множество функций только для одних только операций над массивом. О, и я упоминал, что рассматривал отдельные переменные как массив значений?
оценка c) () и подобные конструкции (как динамическая переменная и имена функций), которые допускают намного большую гибкость (и все еще относительно безопасны, если Вы знаете то, что Вы делаете) - ничто не бьет программу, которая в основном определяет ее собственный технологический маршрут (или даже определенное выполнение) на лету
d) по всей вероятности самая легкая вещь пропустить: поскольку почти все в механизме ЗЕНДА zVal (который в сущности является набором ссылок указателя), способность возвратиться о чем-либо как функциональное возвращаемое значение
кроме того, я хотел бы указать на одну замечательную особенность, но тот, который связан больше с источником PHP, чем язык (и так - перечисленный отдельно):
e) простота записи расширения C (главным образом интерфейсы для других объектов как OpenAL или SDL) - большая структура исходного кода и почти столько же мощных инструментов на 'внутренней части' сколько существует на 'внешней стороне' - если когда-нибудь необходимо разворачивать функциональность просто это немного далее.
На самом деле Вы не совсем правы относительно этого, Вы не можете определить то, что вводит метод, ожидает, он действительно работает, как Вы ожидали бы.
function foo ( array $param0, stdClass $param1 );
Примечание: Это только работает на 'массив' и имена объектов.
И так далее, и можно даже передать в собственных классах как ожидаемые параметры. Вызов методов/функций с чем-то еще приведет к фатальной ошибке.
Другая подсказка о хорошем intellisense в PHP. Мы используем ZendStudio, и он будет на самом деле работать намного лучше, если Вы запишете хороший PHPDocs для своих методов, он изучит тех при выводе подсказок.
Вы можете легко добавить элемент в массив.
$my_array = array();
$my_array[] = 'first element';
$my_array[] = 'second element';
Элемент может быть любым: объект, массив, скаляр ...
Я неравнодушен к другим пользователям PHP. При необходимости легко получить ответы и указания.
В стандартной библиотеке 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;
Мне также нравится разница между 'и ".
$foo = 'Bob';
echo 'My name is {$foo}'; // Doesn't swap the variable
echo "My name is {$foo}"; // Swaps the variable
Поэтому, если ваша строка не требует перестановки переменных, не используйте", это пустая трата времени. Я вижу, как многие люди объявляют строки с помощью "все время.
Примечание: я использую {}, потому что это делает мои переменные более заметными.
preg_split (), array_intersect () и array_intersect_key ().
Давайте посмотрим ...
Тернарные операторы. Они творит чудеса, обрабатывая флажки в результатах формы.
$ var = ($ _POST ['my_checkbox'] == 'проверено')? TRUE: FALSE;
Стоит изучить все замечательные функции обработки строк и массивов. strtotime (), strlen () и strpos () - некоторые из моих любимых.
Класс SimpleXML и функция json_decode (). Вызовите REST API или RSS-канал с помощью file_get_contents (), без труда проанализируйте его с помощью одного из этих инструментов, и все готово.
Подавление ошибок с помощью оператора управления ошибками , @ почти никогда не должно использоваться. Он продвигает ленивые и небезопасные методы кодирования, просто игнорируя ошибки, создает кошмары отладки, поскольку ошибки всех типов - даже фатальные - будут подавлены, а в некоторых случаях могут снизить производительность (особенно при подавлении больших количество ошибок).
Помимо мгновенного доступа для начала кодирования всего, что вам нужно для веб-сайта?
Помимо магических методов и отражений, есть некоторые интересные функции:
сериализация
/ unserialize
- состояние сохранения совершенства через sql, куки, процессы, плоский файл. хороший материал. json_encode
/ json_decode
- мгновенное развлечение AJAX get_class
- полезно для тех утомительных моментов, когда набирают текст call_user_func_array
- мощно, когда вы можете работать со своим кодом в виде строк (думать динамически) method_exists
- отражение func_num_arg
s / func_get_arg
- неизвестные аргументы ftw set_error_handler
/ set_exception_handler
- очень хорошие возможности отладки для языка сценариев Что ж, недавно я доставил свое первое приложение с графическим интерфейсом пользователя платному покупателю, написанное на PHP! Он собирает данные со считывателя штрих-кода или кнопок графического интерфейса, флажков, переключателей или текстовых полей, сохраняет в SQLite или удаленном MySQL, запускает другие приложения Windows, отправляет заархивированные отчеты XML в виде вложений электронной почты, шифрует и дешифрует сохраненные данные и даже воспроизводит звук. по завершении.
Сделал это с miniPHP и Winbinder . Это достаточно скрыто? Думаю, не многие PHP-разработчики действительно пробовали это.
Буферизация вывода с помощью 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();
Содержимое справки, текстовые объявления, функции словаря / индекса, связывание, перенаправление ссылок для отслеживание целей, механизм шаблонов, все это очень просто, если использовать различные комбинации этих двух вещей.
Многие люди не знают этот синтаксис. Когда я использую чистый PHP для создания шаблонов, этот синтаксис предлагает удобный и понятный способ смешивать простые управляющие структуры, такие как if
или foreach
, с кодом вашего HTML-шаблона, обычно в сочетании с ] = $ myVar?>
короткий стиль печати переменной.
Использование элементов массива или свойств объекта внутри строк.
Вместо записи
$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}";
Функции Ctype быстрее, чем preg_match () для проверки основных символов.
ctype_alnum () - Проверить наличие буквенно-цифровых символов
ctype_alpha () - Проверить наличие буквенных символов
ctype_cntrl () - Проверить наличие управляющих символов
ctype_digit () - Проверить наличие числовых символов
... и т.д ...
Я начал переходить на python, и одна вещь, которая мне нравилась в python, - это живой интерпретатор. Только позже, когда я работал над проектом php, я понял, что в php есть эта опция, но она не так широко известна. В командной строке введите php -a
и вставьте любой код php, который хотите протестировать, но не забудьте запустить его с Php
функция_фильтра . Не скрытая жемчужина, но довольно новая.
Я предлагаю использовать 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), который просто перебирает регистр, соответствующий типу, и пытается преобразовать его в известный тип. Остальная часть метода может затем предположить, что один тип или сбой при преобразовании, и работать с этим. И так как я заглушил ВСЕ преобразования в одном классе, отображение типов перестало быть сквозной проблемой, и, поскольку эти функции можно тестировать индивидуально, я мог протестировать их один раз и полагаться на них везде.
Класс ReflectionClass предоставляет информацию о данном классе.
$classInfo = new ReflectionClass ('MyClass');
if ($classInfo->hasMethod($methodName))
{
$cm = $classInfo->getMethod($name);
$methodResult = $cm->invoke(null);
}
Среди прочего, полезно проверить, существует ли метод и вызвать его.
Как уже упоминалось, возможность запускать PHP на уровне командной строки просто фантастическая. Я постоянно устанавливаю сценарии PHP как задания cron для очистки и резервного копирования данных. Просто запустите файл со следующих строк:
#!/usr/bin/php5
<?php
// start coding here
Обратите внимание, что первая строка может отличаться в зависимости от того, где PHP установлен в вашей системе.
Отсюда легко реализовать PHP для более сложных процессов системного уровня, как демоны .
]Я думаю, что их надлежащее уважение к функции GOTO является ключевым.[
] [] Почти любой тип файла может быть включен
, от .html до .jpeg. Любая байтовая строка, найденная внутри связанных открытых тегов PHP, будет выполнена. Да, образ goat.se может содержать все ваши обычные служебные функции. Я предполагаю, что внутреннее поведение include
заключается в преобразовании входного файла в строку и синтаксическом анализе любого кода PHP.
Сокращенные логические цепочки
<?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
Вы можете использовать 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