PHP 5.6 New Features بالعربي

Standard

في حاجات كتير بتتغير وبتتطور بشكل كبير وبصورة سريعة في الـ PHP خصوصاً في اخرنسختين 5.6 و 5.5 ودا راجع للتطور الكبير اللي بيحصل في مجال الـ Web عمتاً … وعشان كده حبيت اوضح شوية حاجات أتغيرت وأتطورت ( المهمة بالنسبالي على الأقل ) في اخر نسختين.

PHP 5.6 New Features

Expressions in Constants

عشان تعمل Constant في PHP عندك طريقتين define() أو const … الأخيرة اسرع لأنها بتعرف الـ Constant في الـ Compile Time عكس define() اللي بتعرفه في الـ Runtime بس مشكلة const أن مينفعش تعرفه بـ dynamic value ولا تعرف تعمل اي نوع من أنواع الـ Operations على الـ value وانت بتعرف الـ Constant وده بالظبط اللي اتعالج في PHP 5.6 وتقدر دلوقتي تعمل Reference لـ Constant تاني وتعمل Basic Operations عادي.

<?php

class DB_Table
{
    const TABLE_PREFIX = 'wp_';
}

class Users_Table extends DB_Table
{
    // that wasn't possible before PHP 5.6
    const TABLE_NAME = self::TABLE_PREFIX .'users';
}

echo Users_Table::TABLE_NAME; // 'wp_users'

class Schedule 
{
    // also wasn't possible before PHP 5.6
    // 24 hours * 60 minutes * 60 seconds
    const DAY_IN_SECONDS = 24 * 60 * 60;
}

echo Schedule::DAY_IN_SECONDS; // 86400
//

Arguments Unpacking, splat operator

صعب شرحها بكلام عربي … هحاول والكود هيوضح اكتر … قبل PHP 5.6 عشان تجيب الـ Arguments اللي اتبعتت لـ function كان ممكن تجيهم بـ func_get_args() … بس مكنتش تقدر تجيب جزىء معين بس … لازم تجيب كله وعشان كده اتعمل الـ splat operator اللي بيخليك تخصص من أول argument معين إن اي حاجة تتبعت بعديه يبقة جوه الـ Array اللي عرفتها بالأسم اللي انت عاوزله … من غير ما تستخدم func_get_args() خالص.

<?php

// a function to multiple the given numbers
// by the first argument passed

multiply_numbers( 5, 10, 20, 30 );

// before PHP 5.6
function multiply_numbers()
{
    $numbers = func_get_args();

    // first number of the array is the multiplier
    $multiplier = array_shift( $numbers );

    var_dump( $multiplier, $numbers );
    // $multiplier => int(5)
    // $numbers => array(3) {
    //  [0] => int(10)
    //  [1] => int(20)
    //  [2] => int(30)
    // }
}

// After PHP 5.6
function multiply_numbers( $multiplier, ...$numbers )
{
    // simple as that !!!!!
    var_dump( $multiplier, $numbers );
    // same result
    // $multiplier => int(5)
    // $numbers => array(3) {
    //  [0] => int(10)
    //  [1] => int(20)
    //  [2] => int(30)
    // }
}

$numbers_to_mutiply = [ 10, 20, 30 ];

// pass the numbers array as arguments in order
multiply_numbers( 5, ...$numbers_to_mutiply );
//

Namespace functions importing

عشان تستخم function في Namespace غير اللي تعرفه فيه كنت لازم تعمل import للـ Namespace بالكامل اللي فيه الـ function دي ومينفعش تعمل Import للـ function بس … ودا اللي اتعالج في PHP 5.6 … بالنسبة للـ functions و الـ Constants

<?php

namespace Accounting 
{
    const DEP_ID = 10;

    function deparement_name()
    {
        echo 'Accounting';
    }
}

// PHP <= 5.5
namespace Sales
{
    // import all namespace stuff
    use Accounting as A;

    // 10 - Accounting
    echo A\DEP_ID ,' - ', A\deparement_name();
}

// PHP >= 5.6
namespace HR
{
    // import only what you need
    use const Accounting\DEP_ID as ACC_DEP_ID;
    use function Accounting\deparement_name as accounting_dep_name;

    // Same result
    // 10 - Accounting
    echo ACC_DEP_ID ,' - ', accounting_dep_name();
}

 


حاجات تانية كويسة اتضافت واتظبطت

  • الـ Performance بقة احسن بكتير جدا من اول PHP 5.4 وفي 5.6 على أتحسن اكتر بشكل ملحوظ.
  • قبل كده PHP 5.6 مكنتش بتسمح يأي File Uploading اكبر من 2 جيجا … دلوقتي تقدر.
  • POST Data بقت بتستهلك memory اقل مرتين تقريباً. وتقدر تقرا من file_get_contents("php://input") اكتر من مرة مش مرة واحدة بس.
  • PHPDBG Debugger بقة موجود built-in … ساعات بيفيد
  • للتفاصيل اكتر عن الجديد PHP 5.6 new features Official List

PHP 5.5 New Features

Generators

في الاول لو مش عارف يعني ايه Generators هو مفهوم صعب شرحه في شكل كلمات فا اعتقد ان مثال هو اكتر حاجة تشرحه فا هنفترض إني محتاج اعمل loop على Array عبارة عن ارقام متسلسلة عشان استخدمها لأي سبب، قبل PHP 5.5 كنا مضطرين نستخم range() عشان تولد الارقام ونعمل loop عليها … مشكلة الطريقة دي انها بتستهلك Memory كتر خصوصاً لو الارقام كتير زي مليون رقم مثلاً وكده هيتحطوا في Array وهيبقة في variable مسحته كبيرة جدا … عشان كده اتضاف Generators عشان الموضوع ده يتحل عن طريق yeild keyword … الكود اللي جاي هيوضح الدنيا أكتر

<?php

// PHP <= 5.4
// generate array of numbers between 0 and one million
// then loop it's elements and assign it to $number
// large variable size close to 100 MB
foreach ( range( 0, 1000000 ) as $number )
{
    echo $number;
}

/**
 * define "range" like generator 
 * using PHP 5.5 generators feature
 * 
 * @param number $start
 * @param number $end
 * @param number $step
 * @return number
 */
function generate_range( $start, $end, $step = 1 ) 
{
    for ( $i = $start; $i < $end; $i += $step ) 
    {
        // $i value which will be returned on each loop
        // "yeild" keyword defines that
        yield $i;
    }
} 

// use defined generator to do the same
// only uses KBs of memory instead
foreach ( generate_range( 0, 1000000 ) as $number )
{
    echo $number;
}

Password hashing

من الحاجات المهمة جدا ان ال passwords لازم تبقة encrypted ومن ضمن الـ Hashing algorithms اللي بينصح بيها هي bcrypt ومكنتش مدعمه وكان لازم نستخدم external library زي phpass مثلا … من اول PHP 5.5 بقت موجودة built-in وكمان الـ API اللي معمولة بتدعم كذا algorithm وممكن تضيف الـ algorithm اللي انت عاوزها.

<?php

// if php version >= 5.5
if ( version_compare( phpversion(), '5.5', '>=' ) ) 
{
    // use built-in library

    // Hash the password.  $hashed_password will be a 60-character string.
    $hashed_password = password_hash( 'my super cool password', PASSWORD_DEFAULT );

    // You can now safely store the contents of $hashed_password in your database!

    // Check if a user has provided the correct password by comparing what they typed with our hash
    password_verify( 'the wrong password', $hashed_password ); // false
    password_verify( 'my super cool password', $hashed_password ); // true
}
else
{
    // older version
    // use phpass library http://www.openwall.com/phpass/

    // Include the phpass library
    require_once( 'phpass-0.3/PasswordHash.php' );

    // Initialize the hasher without portable hashes (this is more secure)
    $hasher = new PasswordHash( 8, false );

    // Hash the password.  $hashed_password will be a 60-character string.
    $hashed_password = $hasher->HashPassword( 'my super cool password' );

    // You can now safely store the contents of $hashed_password in your database!

    // Check if a user has provided the correct password by comparing what they typed with our hash
    $hasher->CheckPassword( 'the wrong password', $hashed_password ); // false
    $hasher->CheckPassword( 'my super cool password', $hashed_password ); // true
}

Finally keyword

من زمان و finally keyword كانت ناقصة في PHP … أخيراً اتضافت في PHP 5.5 … اللي اشتغل لغات تانية هيعرف قيمة البتاعة دي اللي كانت مبهدلة الدنيا وكانت بتخلي الواحد يلف حولين نفسه عشان يشوف حل … اعتقد ان عدم وجدها في الاول ساعد الواحد على انه يبتكر حلول بس برده وجودها بيريح ويخلي الواحد يركز على الـ logic اكتر … المهم المثال ده هيوضح المرونة اللي بتوفرها

<?php

class Web_Socket
{
    // before PHP 5.5
    public static function get_data()
    {
        self::open();
        try
        {
            $result = self::parse();
        }
        catch( Exception $ex )
        {
            // close connection
            self::close(); // repeating code

            // save in error log
            error_log( $ex->getMessage() );

            return $ex;
        }

        // close connection
        self::close(); // repeating code

        return $result;
    }

    // after PHP >= 5.5
    public static function get_data()
    {
        self::open();
        try
        {
            return self::parse();
        }
        catch( Exception $ex )
        {
            // save in error log
            error_log( $ex->getMessage() );

            return $ex;
        }
        finally 
        {
            // code inside "finally" block will execute
            // either an exception occurred or not and before any "return"

            // close connection
            self::close(); // no code repeat 
        }
    }

    public static function parse()
    {
        // parse response data
    }

    public static function open()
    {
        // open connection
    }

    public static function close()
    {
        // close connection
    }
}

Array and String Literal Dereferencing

شكلها كده حاجة مجعلصة ومعقدة بس هي تفهة جدا واللي بيشتغل javascript هيعجبه الحتة دي قوي … الفكرة انك تقدر Access اي String or Array على طول من غير تعمله Assign لـ variable … المثال هيوضح المقصود

<?php

$user_input = 2;

// PHP <= 5.4
// Array
$values = array( 10, 20, 30 );
echo $values[ $user_input ]; // 30

// String
$string = 'Some text for demo';
echo $string[ $user_input ]; // 'm'

// PHP >= 5.5
// Array
echo [ 10, 20, 30 ][ $user_input ]; // 30
// String
echo 'Some text for demo'[ $user_input ]; // 'm'
// access fixed arrays and string without assign to a variable
// something like anonymous variable

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.