Home
About
Search
🌐
English Română
  • Closures and lambda functions in PHP vs. JavaScript

    Citește postarea în română

    Apr 16, 2011 anonymous functions closures JavaScript lambda PHP php5.3
    Share on:

    JavaScript and PHP support both lambda functions and closures. But the terms are poorly understood in both programming languages ​​and are often confused with each other.

    Lambda functions

    Also called anonymous functions. They refer to functions that can be called without being bound to an identifier. One of their purposes is to be passed as arguments. The Lambda name was introduced by Alonzo Church, inventor of lambda calculus in 1936. In lambda calculus all functions are anonymous.

    JavaScript

    In JavaScript lambdas are part of the standard set and there are the preferred method of defining functions.

    For instance:

    1var add = function (a, b) {
    2     return a + b;
    3}
    4alert(add(1, 2)); // 3
    

    Lambda functions are used almost in any context when it comes to JavaScript, like:

    1window.onload = function (e) {
    2     alert('The page has loaded!');
    3}
    

    PHP

    In PHP, lambda functions were introduced in version 4.0.1 using create_function. In version 5.3+ a similar syntax to JavaScript was added, a much more readable and elegant way of defining a function.

    This means that in PHP there are two ways of creating a lambda function:

     1// PHP 4.0.1+
     2$add = create_function('$a, $b', 'return $a + $b;');
     3
     4// vs.
     5
     6// PHP 5.3+
     7$add = function ($a, $b) {
     8     return $a + $b;
     9};
    10
    11echo $a(1,2); // 3
    

    Lambda functions can be used as parameter for other functions, such as usort:

    1$array = array(4, 3, 5, 1, 2);
    2usort($array, function ($a, $b) {
    3     if ($a == $b) {
    4          return 0;
    5     }
    6     return ($a < $b) ? -1 : 1;
    7});
    

    Even more, PHP 5.3+ allows calling an object as a anonymous function:

    1class test {
    2     function __invoke($a) {
    3          echo $a;
    4     }
    5}
    6$a = new test();
    7$a('test'); // 'test'
    

    Closures

    The closure is really the misunderstood concept of the two. In general confusion appears because closures may involve lambda functions. A closure refers to the ability of a function/object to access the scope in which it was created even if the parent function has ended it’s execution and returned. In other words, the function/object returned by a closure is running in the scope in which it was defined.

    In JavaScript the notion of closure is part of the standard arsenal, because the language is not based on the traditional object model, but rather on prototypes and functions. But JavaScript has some traditional object model parts, like the fact that you can use “new” to construct an object based on a function that plays the role of a class. In PHP closures are more of an new way to approach problems, because PHP is part of the traditional object model family.

    JavaScript

    In JavaScript the notion of closure is widely used, it’s so popular because JavaScript is not a traditional object orientated language, but rather a functional one, based on prototype inheritance.

    JavaScript doesn’t have Public, Private and Protected, but rather only Public and Private and objects an inherit from each other, without using classes.

    Another issue is the scope, because the global scope is used by default. This issues can be fixed in an elegant fashion using closures:

     1var closure = function () {
     2     var sum = 0;
     3     return {
     4          add: function (nr) {
     5               sum += nr;
     6          },
     7          getSum: function () {
     8               return sum;
     9          }
    10     }
    11}();
    12
    13closure.add(1);
    14closure.add(2);
    15console.log(closure.getSum());
    

    In the example above, sum is a private property and in theory can only be accessed and modified by the closure function. The interesting part is that the parentheses from the end of the function definition, signify that this function will be immediately  executed and therefore will return the result which is an object. At this point the original function will only exist for serving the return object, encapsulating therefor the private variable.

    Although the function has finished execution, through this closure the returned object can still access the variables defined in the function scope, because that was the environment in which it was created.

    This becomes even more interesting when a function returns another function:

     1var counter = function () {
     2    var counter = 0;
     3    console.log('in closure');
     4    return function () {
     5        console.log('in the anonymous function');
     6        return ++counter;
     7    };
     8};
     9var counter1 = counter();
    10
    11console.log(counter1()); // 1
    12
    13var counter2 = counter();
    14console.log(counter2()); // 1
    15console.log(counter1()); // 2
    

    The output will be:

    1in closure
    2in the anonymous function
    31
    4in closure
    5in the anonymous function
    61
    7in the anonymous function
    82
    

    What actually happens is that the first function is executed and returns an anonymous function that can still access the environment in which it was created. In my opinion this is where the confusion between closures and lambda functions comes from, because a function returns another function.

    The difference between examples is that in the first one the closure function executes immediately, and in the second example when counter is executed it’s returning a result that is actually a function definition, which in turn can be executed. Of course the second example can be modified to act just like in the first example using parenthesis.

    PHP

    As I said above, the notion of closure in PHP is not as important as in JavaScript.

    Considering that lambda functions are available in the language since version 4, closures only appeared with PHP 5.3+.

    Because of the block scope nature of PHP, there is a better encapsulation but there is a lot less flexibility compared to JavaScript. Basically in PHP you must specify using the use instruction what will the anonymous function be able to access from the closure scope.

     1function closure () {
     2     $c = 0;
     3     return function ($a) use (&$c) {
     4          $c += $a;
     5          echo $a . ', ' . $c . PHP_EOL;
     6     };
     7}
     8
     9$closure = closure();
    10
    11$closure(1);
    12$closure(2);
    

    Unlike JavaScript, in PHP closures can not return objects, or rather the object can not be bound to the scope in which it was created, unless you send the variables as a reference to the constructor, in which case is not very elegant and I can’t imagine a scenario that would absolutely need closure for this.

    Like in the JavaScript examples, instead of parentheses “()” at the end of the function, in PHP to run a function immediately after defining it call_user_func() or call_user_func_array() can be used:

     1$closure = call_user_func(function () {
     2    $c = 0;
     3    return function ($a) use (&$c) {
     4        $c += $a;
     5        echo $a . ', ' . $c . PHP_EOL;
     6
     7    };
     8});
     9
    10$closure(1);
    11$closure(2);
    
  • Parse ini files in PHP

    Citește postarea în română

    Mar 12, 2011 ini parse_ini_file PHP
    Share on:

    Why “ini” files? Because there are more convenient! Most servers in the *nix world have “ini” or “conf” configuration files. In the PHP world there are preferred PHP configuration files, which are usually arrays. Wouldn’t be more elegant to have an ini file without PHP code in it?

    Fortunately PHP has a couple of native functions just for that: parse_ini_file and parse_ini_string.

    The principle is very simple, you give an configuration ini file as a parameter and it will return an array.

    A little example:

     1;config.ini
     2
     3[simple]
     4number = 1
     5another = 2
     6fraction = 0.2
     7
     8[escape]
     9path = /usr/bin/php
    10url = https://blog.claudiupersoiu.ro
    11error = '<a href="%path%">%error%</a>'
    12
    13[array]
    141 = a
    152 = b
    163 = c
    

    To parse the previous file:

    1$config = parse_ini_file('config.ini', true);
    2var_dump($config);
    

    The second parameter specifies if the sections will become keys in the resulting array. Honestly I don’t think of a case when that wouldn’t be useful.

    Seems slow? In fact for the file above is faster to parse then to include an array already parsed. The difference on my computer is ~0.00002s.

    But the above file is not exactly big, so let’s get to a more serious ini file, like php.ini. Here the difference was bigger in favor of array, which won whit an advantage of ~0.0003, which means about half of parsing time that was ~0.0006s.

    Taking into consideration that my computer is pretty fast and concurrent request can add an overhead for big files, sometimes it is useful to use a cache of the ini file.

    Fortunately this is easy to do in PHP.

    1$cache = var_export($config, true);
    2
    3file_put_contents('cache/config.php', "<?php\n\$config = " . $cache . ';');
    

    Now you just need to include cache/config.php file and of course regenerate it when something changes in the ini file.

    PHP should have write permissions for the cache directory.

  • PHP CLI Input/Output from keyboard, pipe or arguments

    Citește postarea în română

    Feb 26, 2011 CLI PHP stderr stdin stdout
    Share on:

    Somewhere in the certification guide there is a chapter dedicated to “streams”.

    A small part of it represents the input, output and error streams from PHP.  C/C++ has famous stdio.h library, but few people knows that input from keyboard is possible in PHP too.

    In short, this can be achieved with PHP://STDIN, PHP://STDOUT and PHP://STDERR.

    As this subject is panicking a lot of developers that are studding for ZCE, let’s get the confusion out. A stream represents a flow of information, just like when your reading and internal or external file using fopen.

    But as a programmer best understands from cod, let’s get to more practical stuff.

    Input

    For input there is PHP://STDIN.

    The next script is reading input from the keyboard:

     1#!/usr/bin/php
     2<?php
     3// initializing the input stream
     4$input = fopen('php://stdin', 'r');
     5
     6// welcome message
     7echo 'Type "exit" and then enter to exit' . PHP_EOL;
     8
     9// reading the stream input
    10while($line = fgets($input, 1024)) {
    11 // exit condition with line terminator
    12 if($line == 'exit' . PHP_EOL) {
    13    echo 'bye bye' . PHP_EOL;
    14    break;
    15 }
    16 // displaying the input from the keyboard
    17 echo 'You say: ' . $line . PHP_EOL;
    18}
    19
    20// close stream
    21fclose($input);
    

    The first line of code is specially for Linux/Unix, and Windows users can remove it.

    The cod above must be placed in to a file, like for instance testStream.php.

    You must have execution rights for that file, witch can be achieved with:

    1chmod +x testStream.php
    

    Then the file can be executed in Linux directly with:

    1$./testStream.php
    

    In Windows you must give the absolute path to PHP, if the path is not already in the system include path:

    1>c:\php\php.exe testStream.php
    

    Notice that the input is with “\n” or “\r\n” at the end of the line, that’s why I’m testing “exit” with the line terminator (PHP_EOL). I’m using PHP_EOL so it can work with both Linux/Unix and Windows.

    Output

    For output there is PHP://STDOUT.

    Unlike input, the output is a lot less relevant. Basically the output is the standard one which can be achieved with echo and print.

    But for educational purpose let’s modify the previous file to use PHP://STDOUT:

     1#!/usr/bin/php
     2<?php
     3// initializing the input stream
     4$input = fopen('php://stdin', 'r');
     5
     6// initializing the output stream
     7$output = fopen('php://stdout', 'w');
     8
     9// welcome message
    10fwrite($output, 'Type "exit" and then enter to exit' . PHP_EOL);
    11// reading the steam input
    12while($line = fgets($input, 1024)) {
    13 // exit condition with line terminator
    14 if($line == 'exit' . PHP_EOL) {
    15    fwrite($output, 'bye bye' . PHP_EOL);
    16    break;
    17 }
    18 // displaying the input from the keyboard
    19 fwrite($output, 'You say: ' . $line . PHP_EOL);
    20}
    21
    22// close input stream
    23fclose($input);
    24
    25// close output stream
    26fclose($output);
    

    Basically there isn’t any change in the script, is just that the output was displayed using PHP://STDOUT explicitly.

    Error

    A more interesting subject then the output is the error stream.

    Basically is more relevant in the Unix/Linux environment, probably is relevant in Windows too but I don’t know how to capture it. If your reading this blog and you know how to do this please leave a comment below.

    And again let’s change the script so that error messages will use the proper stream. I’ll output an error each time the user enters more then 5 characters (I’m sorry but I don’t have a lot of ideas right now):

     1#!/usr/bin/php
     2<?php
     3// initializing the input stream
     4$input = fopen('php://stdin', 'r');
     5
     6// initializing the output stream
     7$output = fopen('php://stdout', 'w');
     8
     9// initializing the error stream
    10$err = fopen('php://stderr', 'w');
    11
    12// welcome message
    13fwrite($output, 'Type "exit" and then enter to exit' . PHP_EOL);
    14
    15// reading the steam input
    16while($line = fgets($input, 1024)) {
    17 // exit condition with line terminator
    18 if($line == 'exit' . PHP_EOL) {
    19    fwrite($output, 'bye bye' . PHP_EOL);
    20    break;
    21 }
    22
    23 if(strlen($line) > 5) {
    24    fwrite($err, 'WARNING! Input greater then 5 characters: ' . $line);
    25    continue;
    26 }
    27
    28 // displaying the input from the keyboard
    29 fwrite($output, 'Ai scris: ' . $line . PHP_EOL);
    30}
    31
    32// close input stream
    33fclose($input);
    34
    35// close output stream
    36fclose($output);
    37
    38// close error stream
    39fclose($err);
    

    By default in Linux error messages are displayed to the screen, but there are scenarios when the errors are redirected for instance to a log file .

    To redirect the error messages to a log file 2>> is used like in the following example:

    1$./testStream 2>>testStream.log
    

    Input from PIPE (|)

    Let’s take the fallowing scenario: the output of a previous operation contains a serious of email addresses that are both valid and invalid. There should be two files: valid.txt with valid addresses and invalid.txt with invalid ones. The email addresses will be send to the script using pipe.

    The list of email addresses will be simulated using a file called email.txt:

    1valid_addres@yahoo.com
    2another_valid@yahoo.co.uk
    3invalid@y.c
    4good@gmail.com
    5invalid addres@hotmail.com
    6foo
    

    The name of the script will be emailTest.php:

     1#!/usr/bin/php
     2<?php
     3// initializing the input stream
     4$input = fopen('php://stdin', 'r');
     5
     6// initializing error stream
     7$err = fopen('php://stderr', 'w');
     8
     9// unlike the previous cases, here is tested for the end of the file
    10// because the input is not coming from keyboard
    11while(!feof($input)) {
    12 // the value is trimmed to remove line terminators
    13 $line = trim(fgets($input, 1024));
    14
    15 // test email address
    16 if(filter_var($line, FILTER_VALIDATE_EMAIL)) {
    17    // direct output, equivalent to php://stdout stream
    18    echo $line . PHP_EOL;
    19 } else {
    20    // invalid addresses are redirected to the php://stderr stream
    21    // to be intercepted later
    22    fputs($err, $line . PHP_EOL);
    23 }
    24}
    25
    26// close input stream
    27fclose($input);
    28
    29// close error stream
    30fclose($err);
    

    For testing I’ll simulate the output of email addresses with the cat command:

    1cat email.txt |./emailTest.php >valid.txt 2>invalid.txt
    

    Now the files valid.txt and invalid.txt from the current directory contain the proper values.

    Processing like this is very useful for complex operations. Basically is an alternative to Shell Scripting (linux) or Batch Scripting (windows), which are not as flexible.

    Script arguments

    Often is useful to send direct arguments to a script to have, for instance, a different functionality.

    Let’s change the previous scenario to receive the name of the file that contains the email address, as a script argument.

    The script arguments are automatically stored in the $argv variable. Notice the first element of the array ($argv[0]) is the name of the script!

    The modified example is as follows:

     1#!/usr/bin/php
     2<?php
     3
     4// the count stars at 1 to eliminate the name of the script
     5for ($i = 1; $i < count($argv); $i++) {
     6  // initializing the input stream
     7  $input = fopen($argv[$i], 'r');
     8
     9  // initializing error stream
    10  $err = fopen('php://stderr', 'w');
    11
    12  if(!$input) {
    13   continue;
    14  }
    15
    16  // unlike the previous cases, here is tested for the end of the file
    17  // because the input is not coming from keyboard
    18  while(!feof($input)) {
    19   // the value is trimmed to remove line terminators
    20   $line = trim(fgets($input, 1024));
    21
    22   // test email address
    23   if(filter_var($line, FILTER_VALIDATE_EMAIL)) {
    24     // direct output, equivalent to php://stdout stream
    25     echo $line . PHP_EOL;
    26   } else {
    27     // invalid addresses are redirected to the php://stderr stream
    28     // to be intercepted later
    29     fputs($err, $line . PHP_EOL);
    30   }
    31  }
    32
    33  // close input stream
    34  fclose($input);
    35
    36  // close error stream
    37  fclose($err);
    38}
    

    Now just run the script with arguments:

    1$./argTest.php email.txt >valid.txt 2>invalid.txt
    
  • 100+ PHP ZCE certified developers in Romania

    Citește postarea în română

    Feb 25, 2011 certificare certification PHP zce
    Share on:

    In 2008 when I had my first certification exam there were 22 Zend Certified Engineers in Romania, I was number 23.

    With time looks like more people took the exam, and this week the number of 100 Zend Certified Engineers was exceeded!

    After a search of PHP ZCE, full of joy, I find that the 100th certified web developer in Romania is actually my colleague and friend Emanuel Croitoru,  whom I’ve tortured for weeks on end with: “don’t worry, is easy”.

    When the time came to really study the manual it didn’t look that simple. 🙂

    But after all, the determination to make this step is just another reason that a ZCE is trying to become a good web developer!

  • PHP for Android a first opinion

    Citește postarea în română

    Aug 21, 2010 Android PHP PHP for Android
    Share on:

    When it comes to Android and PHP a lot has been written about PHP for Android.

    The concept is simple, Google launched Android Scripting Environment (ASE).

    ASE is as the name suggests, a scripting environment, and the apps are not compiled and they can be modified at all times by the user.

    Over ASE there are extensions installed for different languages like: Python, LUA, Perl, JavaScript or JRuby.

    Unfortunately there isn’t official support for PHP from Google, but there is PHP for Android, project which allows the integration between PHP CLI and this environment.

    The installation is very simple and is done directly on the phone. For development Android SDK simulator can be used.

    One of the issues is that the app can’t be packed as an APK, so it can’t be posted on Android Market.

    Basically this was the only issue raised so far everywhere, issue that doesn’t seem exactly big considering the facilities available in this environment.

    I’ve searched for apps build with PFA, I’ve found only a few, actually I found only a few even in other languages using ASE. Why aren’t the users eager to develop in this environment? Simple, using the scripting environment you can access a lot of facilities of available on the phone, like vibrating for instance and about all the available dialogs. But there is an essential feature which is totally lacking (or at least at the time this blog is written), there isn’t a graphical interface, like any kind of window that isn’t a dialog.

    So what is the purpose of adding an app to Android Market if there is no graphic interface? I don’t believe there is almost no real consistent reason at this point.

    But what are the developers doing in this environment then? Well Cellbots for instance.Basically you can do some interesting toys, but don’t expect to do real apps (yet). Another project it was sending a NexusOne into space.

    So the project is interesting, but I don’t think it has the purpose of developing traditional apps just yet.

    • ««
    • «
    • 3
    • 4
    • 5
    • 6
    • 7
    • »
    • »»

Claudiu Perșoiu

Programming, technology and more
Read More

Recent Posts

  • Is PHP dead in 2026?
  • 30 years of PHP
  • HTTPS certificate monitoring in Home Assistant
  • Adding a slider to Tasmota using BerryScript
  • The future proof project
  • Docker inside wsl2
  • Moving away from Wordpress
  • Custom path for Composer cache

PHP 51 MISCELLANEOUS 47 JAVASCRIPT 14 MAGENTO 7 MYSQL 7 BROWSERS 6 DESIGN PATTERNS 5 HOME AUTOMATION 3 LINUX-UNIX 2 WEB STUFF 2 GO 1

PHP 37 JAVASCRIPT 15 PHP5.3 11 MAGENTO 7 PHP6 7 MYSQL 6 PHP5.4 6 ZCE 6 CERTIFICARE 5 CERTIFICATION 5 CLOSURES 4 DESIGN PATTERNS 4 HACK 4 ANDROID 3
All tags
3D1 ADOBE AIR2 ANDROID3 ANGULAR1 ANONYMOUS FUNCTIONS3 BERRYSCRIPT1 BOOK1 BROWSER2 CARTE1 CERTIFICARE5 CERTIFICATION5 CERTIFIED1 CERTIFIED DEVELOPER1 CHALLENGE1 CHM1 CLASS1 CLI2 CLOSURES4 CODE QUALITY1 CODEIGNITER3 COFFEESCRIPT1 COLLECTIONS1 COMPOSER1 CSS1 DEBUG1 DESIGN PATTERNS4 DEVELOPER1 DEVELOPMENT TIME1 DOCKER2 DOCKER-COMPOSE1 DOUGLAS CROCKFORD2 ELEPHPANT2 FACEBOOK2 FFI1 FINALLY1 FIREFOX3 GAMES1 GENERATOR1 GO1 GOOGLE1 GOOGLE CHROME1 GOOGLE MAPS1 HACK4 HOMEASSISTANT3 HTML2 HTML HELP WORKSHOP1 HTML51 HUG1 HUGO1 INFORMATION_SCHEMA1 INI1 INTERNET EXPLORER3 IPV41 IPV61 ITERATOR2 JAVASCRIPT15 JQUERY1 LAMBDA1 LINUX1 MAGENTO7 MAGENTO22 MAP1 MINESWEEPER1 MOTIVATION1 MYSQL6 NGINX1 NODE.JS2 NOSQL1 OBSERVER3 OBSERVER PATTERN1 OOP1 OPERA1 OPTIMIZATION1 ORACLE1 PAGESPEED1 PAIR1 PARSE_INI_FILE1 PHONEGAP2 PHP37 PHP ELEPHANT2 PHP FOR ANDROID1 PHP-GTK1 PHP42 PHP53 PHP5.311 PHP5.46 PHP5.53 PHP5.61 PHP67 PHP7.41 PROGRAMMING1 REVIEW1 ROMANIAN STEMMER2 SAFARY1 SCALAR TYPE HINTING1 SCHEME1 SET1 SHOPPING CART PRICE RULE1 SINGLETON1 SOAP1 SPL2 SQLITE1 SSH1 STACK TRACE1 STDERR1 STDIN1 STDOUT1 SUN1 SYMFONY2 TASMOTA1 TEST TO SPEECH1 TITANIUM2 TRAITS1 TTS1 UBUNTU1 UNICODE2 UTF-82 VECTOR1 WEBKIT1 WINBINDER1 WINDOWS2 WORDPRESS1 WSL21 YAHOO3 YAHOO MAPS1 YAHOO OPEN HACK1 YSLOW1 YUI1 ZCE6 ZCE5.31 ZEND3 ZEND FRAMEWORK3
[A~Z][0~9]

Copyright © 2008 - 2026 CLAUDIU PERȘOIU'S BLOG. All Rights Reserved