Тук http://shootout.alioth.debian.org/ има интересни сравнения на това как се държат различните програмни езици, кои е по-бърз и кои използва по-малко памет и други такива.
Lambda функции и Closures са неща, който от доста време се надявам да ги има в PHP, и това вече е факт. Жалкото е че PHP5.3 и PHP6 ще има да се чака много време, докато започнат да се използват масово.
Lambda функцията изглежда така:
function & (parameters) use (lexical vars) { body }
Ето няколко примера:
function replace_in_array ($search, $replacement, $array) {
$map = function ($text) use ($search, $replacement) {
if (strpos ($text, $search) > 50) {
return str_replace ($search, $replacement, $text);
} else {
return $text;
}
};
return array_map ($map, $array);
}
като много се надявам това да може да се напише и така:
function replace_in_array ($search, $replacement, $array) {
return array_map(function ($text) use ($search, $replacement) {
if (strpos ($text, $search) > 50) {
return str_replace ($search, $replacement, $text);
} else {
return $text;
}
}, $array);
}
Също така има и нов “магически” клас метод __invoke:
class Example {
public function __invoke (){
echo "Hello World!\n";
}
}
$foo = new Example;
$foo();
Даже, вече го виждам как ще промени един мой клас за тестване на тагове - TagMatcher:
// сегашната версия $matcher = new TagMatcher($tag1); echo $matcher->match($tag2); // бъдещата версия $match = new TagMatcher($tag1); echo $match($tag2);
Също така има промени и по Reflection API. За повече информация:
http://wiki.php.net/rfc/closures
В заключение, ще кажа че синтаксиса на Lambda функциите и Closures е наистина добър, като много напомня на този в JavaScript и изглежда като нормална част от PHP. И че PHP с новите подобрения, плюс няколко PECL добавки като operator, classkit и runkit, и малко оптимизция става още по-мощен език.
Аrray в PHP беше нещото което най-много ми хареса в php когато започвах да се занимава с програмиране. С времето обаче разбрах че array са много странно нещо, те са кръстоска между стандартния масив и hash таблици. По този въпрос има много материали в Интернет, където се казват плюсовете и минусите. Но това което искам се га да покажа е малко по различен поглед към Array.
Обикновено аз както и голяма част от PHP дивелопърите ползваме масивите или как нормален масив или като hash таблица, но много рядко като смесено нещо. Но при определени ситуации е доста полезно да се ползват като и двата типа на работа.
Например имам едни класове с който си дефинирам таблиците в базата данни и те генерират sql код и т.н.:
$this->createTable('product_brands', array(
'name' => array('string', 'limit' => 7),
'ord' => 'int',
'visible' => 'boolean',
));
Което за мен и моите колеги е доста ясно и разбираемо. Още повече че самото “разчитане” на типа на всяка колона е много лесно:
function column($name, $options){
$options = (array) $options;
$type = isset($options['type']) ? $options['type'] : $options[0];
// ....
}
Друго място на което ги ползвам е в един метод класа ми за работа с базиданни:
// WHERE visible = '1'
$db->where("'visible'='1'");
// WHERE category_id = '$id' AND visible = '1'
$db->where(array('category_id' => $id, 'visible' => 1));
// WHERE name LIKE '%{$name}%' AND category_id = '$id' AND visible = '1'
$db->where(array("name LIKE '%{$name}%'", 'category_id' => $id, 'visible' => 1));
Като where трябва да върне sql условие. А самия where метод е доста простичко написан:
function where($cond) {
if (!$cond)
return '';
if (!is_array($cond))
return 'WHERE ' . $cond . ' ';
$vals = array();
foreach($cond as $field => $value) {
$vals[] = is_numeric($field) ? $value : $field . '=' . $this->quote($value);
}
return 'WHERE ' . join(' AND ', $vals) . ' ';
}
update: Сега се сетих, че може array да се ползват по подобен начин и в новата версия на tag функцията ми, с която генерирам html код:
// <a href="myLink">some</a>
tag(array('a', 'href' => 'myLink', 'some');
// <a href="myLink">some</a>
tag(array('a', 'some', 'href' => 'myLink');
// <span>text</span>
tag(array('span', 'text');
// <img src="image.png" alt="" />
tag(array('img', 'src' => 'image.png', 'alt' => '');
п.п. доста от тези примери ще изглеждат още по-добре ако се сбъднат желанията ми от PHP6 whishlist ( особено точки 4 или 7 ).
Днес чистейки старите си bookmark-oве, попаднах на тази интересна статия от 09 Май 2008 (малко старичка):
http://www.infoq.com/news/2008/05/should-you-learn-languages
В нея се задава въпросът дали има смисъл и дали е добре да владеем повече програмни езици. Там попадам на следния цитат (няма да го превеждам, че да не се загуби смисъла):
The programming languages, or rather language types, you understand (not necessary is most fluent in), tends to steer your thinking. According to natural language researchers, if there is a word missing (or a category of words) from a language, people have a hard time thinking about the concepts that the missing words represents. Paul Graham states approximately the same thing about programming languages.
Това ми напомня че преди години ми разказваха една книга (която така и не можах да прочета
). В нея се разправяло за държава (или остров беше май), където хората, които го управлявали контролирали населението като махали думи от речниците. Основната идея е че като не знаеш нещо или по точно като не знаеш как се казва е много трудно (а за доста хора и невъзможно) да си помислиш за него. Като например ако не знам, че има дума за “сладолед”, как мога въобще да си помисля, че искам сладолед. Или във контекста на книгата, като не знаят какво е бунт и свобода как могат хората да си помислят за тях.
Ако се върнем в IT света. Знанията който придобих при работата с JavaScript или Ruby ми помогнаха страшно много с PHP, като прилагам (до колкото е възможно) част от семантиката в тези езици. Напоследък като се заглеждам по Python, гледам по малко по-различен начин на организацията на кода и други такива. А знанията от предишни езици страшно много ми помогнаха да оценя някои добри неща (да, даже и такива неща има) в Java. А и все пак всеки средно статистически developer му се налага да работи поне с 2-3 езика на куп (PHP/ASP.NET/JAVA/Ruby/Python , JavaScript, ActionScript 2/3, …).
И както чух от една лекция на Светлин Наков:
След 7-8 мия програмен език, останалите се учат за 1-2 дена
.
PHP има най-добрата документация, която аз съм виждал и ползвал. Главно я ползвам като в адрес бара на Firefox-a напиша например php array_filter и директно отивам на http://bg.php.net/array_filter. И за това почти не минавам през началото на сайта и на manual-a.
Но днес попаднах на 2 неща който не ги бях забелязал - Classkit и runkit. Основаната им идея е да се променят, предефинират, изтриват, копират вече дефинирани класове и функции. Което много интересно и е едно от главните плюсове на езици като Ruby и JavaScript.
Лошото е че се водят експириментални и е малко рисковано да се ползват. Въпреки че е доста интересно да си по играеш с тях. Дано скоро станат достатъчно стабилни за реално използван в проекти.

