یوشا آل ایوب

وبگاه دست نوشته ها و تجربیات شخصی
بِسمِ اللّه‏ِ الرَّحمنِ الرَّحيمِ

یوشا آل ایوب

وبگاه دست نوشته ها و تجربیات شخصی

یوشا آل ایوب

دکتر مصطفی چمران: می گویند تقوا از تخصص لازمتر است، آنرا می پذیرم، اما می گویم: آنکس که تخصص ندارد و کاری را می پذیرد، بی تقواست!

تبلیغات
Blog.ir بلاگ، رسانه متخصصین و اهل قلم، استفاده آسان از امکانات وبلاگ نویسی حرفه‌ای، در محیطی نوین، امن و پایدار bayanbox.ir صندوق بیان - تجربه‌ای متفاوت در نشر و نگهداری فایل‌ها، ۳ گیگا بایت فضای پیشرفته رایگان Bayan.ir - بیان، پیشرو در فناوری‌های فضای مجازی ایران

۱۸ مطلب با موضوع «کامپیوتر :: نرم افزار :: برنامه نویسی :: PHP» ثبت شده است

<?php

switch (1)
{
    case 1:
        $var = 'Test';
        echo ' in case 1 ';
    break;

    case 2:
        if (isset($var)) echo '($var is set)';
        echo ' in case 2 ';
    break;

    case 3:
        echo ' in case 3 ';
    break;
}
// Result: in case 1

switch (1)
{
    case 1:
    {
        $var = 'Test';
        echo ' in case 1 ';
    }

    case 2:
        if (isset($var)) echo '($var is set)';
        echo ' in case 2 ';
    break;

    case 3:
        if (isset($var)) echo '($var is set)';
        echo ' in case 3 ';
    break;
}
// Result:  in case 1 ($var is set) in case 2

switch (1)
{
    case 1:
        $var = 'Test';
        echo ' in case 1 ';

    case 2:
        if (isset($var)) echo '($var is set)';
        echo ' in case 2 ';
    break;

    case 3:
        if (isset($var)) echo '($var is set)';
        echo ' in case 3 ';
    break;
}
// Result:  in case 1 ($var is set) in case 2

switch (1)
{
    case 1:
        $var = 'Test';
        echo ' in case 1 ';

    case 2:
    {
        if (isset($var)) echo '($var is set)';
        echo ' in case 2 ';
    }

    case 3:
        if (isset($var)) echo '($var is set)';
        echo ' in case 3 ';
    break;
}
// Result:  in case 1 ($var is set) in case 2 ($var is set) in case 3

در PHP، ظاهراً بودن یا نبودن اون گیومه ها {} هیچ تاثیری در روند اجرای برنامه نداره، بلکه این break هستش که تعیین کنندست... در حالی که در بیشتر زبانها (مثل java, pawn, c++ و...) می تونه حوزه/scope متغیر ها رو داخل هر case تعیین کنه.

توضیح رسمی C99 درباره دستور Switch:

CASE: Case statements are only 'labels'. This means the compiler will interpret this as a JUMP DIRECTLY to the label.
BREAK: A break statement terminates execution of the smallest enclosing switch or iteration statement.

البته این یه نکته ریزه که هنوز خیلی از برنامه نویس ها ازش مطلع نیستن!
من هم بعد از 1-2 ساعت تحقیق متوجه این موضوع شدم، چراکه مستندات خودشون هم به این نکته اشاره نکردن. (تا جایی که گشتم)

۰ نظر ۹۴/۱۲/۱۸
یوشا آل ایوب

اینها چیزی نیستند جز software bundle! که توسط شرکت ها و گروه های نرم افزاری برای یک هدف جمع آوری شدن. و اون هم فراهم کردن بستری سریع و آسون برای برنامه نویسی.

مفهوم ساده Software bundle یعنی تعدادی نرم افزار مستقل  که در یک پکیج گردآوری شدن و توسط یک برنامه واحد مدیریت میشن.


۱ نظر ۹۴/۱۱/۲۱
یوشا آل ایوب

 

واقاً چیه؟ enlightened

$myVar = 4;
$unknown = static function() use ($myVar) {return ($myVar + $myVar[NULL] + $myVar[0]);};

print_r($unknown);
echo $myVar;

/*

Output:

Closure Object
(
    [static] => Array
    (
        [myVar] => 4
    )

)

4

*/
۱ نظر ۹۴/۰۵/۱۵
یوشا آل ایوب

 

سرعت بیشتر get_magic_quotes_runtime و get_magic_quotes_gpc برای گرفتن مقدار Magic quotes:

if (get_magic_quotes_gpc() || get_magic_quotes_runtime())
{
    #...
}

0.0123500823970
0.0124192237854
0.0124502182007
0.0128602981567
0.0129485130310
0.0129580497742
0.0129580497742
0.0129890441895
0.0129985809326
0.0130105018616
0.0130105018616
0.0130200386047
0.0130295753479
0.0130391120911
0.0141811370850

سرعت کمتر ini_get برای گرفتن مقدار Magic quotes:

if (ini_get('magic_quotes_gpc') || ini_get('magic_quotes_runtime'))
{
    #...
}

0.0201392173767
0.0201511383057
0.0201606750488
0.0201988220215
0.0202012062073
0.0202107429504
0.0202202796936
0.0202417373657
0.0202584266663
0.0203299522400
0.0219893455505
0.0220894813538
0.0238800048828
0.0250506401062
0.0255298614502
۰ نظر ۹۳/۰۸/۰۸
یوشا آل ایوب

مقایسه سرعت بین دستورات شرطی If Else و Ternary(سه تایی)...

سرعت بیشتر:

if x: ...
else: ...
endif;

0.0336170196533
0.0337123870850
0.0337123870850
0.0338077545166
0.0338077545166
0.0339031219482
0.0339031219482
0.0339984893799
0.0339984893799
0.0339984893799
0.0343084335327
0.0343084335327
0.0344038009644
0.0346183776855
0.0608921051025

سرعت کمتر:

x ? ... : ...;

0.0385999679565
0.0389099121094
0.0390052795410
0.0390052795410
0.0392198562622
0.0392198562622
0.0392913818359
0.0393867492676
0.0394105911255
0.0395059585571
0.0395059585571
0.0395059585571
0.0396013259888
0.0405073165894
0.0436067581177
۱ نظر ۹۳/۰۵/۰۳
یوشا آل ایوب

مقایسه سرعت ثابت PHP_EOL در مقابل سرعت "\n"

 

سرعت کمتر:

$variable = 'abcdef' . PHP_EOL;

0.000889062881470
0.000889062881470
0.000889062881470
0.000890016555786
0.000890970230103
0.000891208648682
0.000892162322998
0.000894069671631
0.000952959060669
0.001131057739260

سرعت بیشتر:

$variable = 'abcdef' . "\n";

0.000457048416138
0.000459194183350
0.000470161437988
0.000473976135254
0.000476121902466
0.000491142272949
0.000508069992065
0.000571012496948
0.000572204589844
0.000643014907837

 

نکته: البته ثابت PHP_EOL در PHP 5.0.2 به بعد تعبیه شده، و در هر سیستم عاملی به مقدار متفاوتی اشاره می کنه.

https://github.com/php/php-src/blob/master/main/php.h#L48

#ifdef PHP_WIN32
#    include "tsrm_win32.h"
#    include "win95nt.h"
#    ifdef PHP_EXPORTS
#        define PHPAPI __declspec(dllexport)
#    else
#        define PHPAPI __declspec(dllimport)
#    endif
#    define PHP_DIR_SEPARATOR '\\'
#    define PHP_EOL "\r\n"
#else
#    if defined(__GNUC__) && __GNUC__ >= 4
#        define PHPAPI __attribute__ ((visibility("default")))
#    else
#        define PHPAPI
#    endif
#    define THREAD_LS
#    define PHP_DIR_SEPARATOR '/'
#    define PHP_EOL "\n"
#endif
۰ نظر ۹۳/۰۱/۰۷
یوشا آل ایوب

 

نکاتی راجب error_reporting و set_error_handler و register_shutdown_function:

 

  • دستور error_reporting

برخلاف تصور خیلی ها که فکر می کنند این دستور خطاها رو "نمایش" میده، این دستور برای دریافت خطاها هستش (نه حتی Log کردن خطا)

  • دستور set_error_handler

میشه گفت دستوری برای ثبت تابع customize کننده خطا هستش (مثلاً برای کادر بندی خطا، ایمیل کردن خطا، دادن راه حل به کاربر و...)

  • دستور register_shutdown_function

دستوری برای ثبت تابع callback هستش که هنگام متوقف شدن و پایان یافتن پردازش اسکریپت، اون تابع callback اجرا بشه (همچنین زمانی که exit / die صدا زده میشه)
اصول نامگذاری: onScriptShutdown یا onScriptEnd یا onShutdown....
نکته: توسط این دستور میشه خطاهای نوع E_ERROR , E_PARSE , E_CORE_ERROR , E_COMPILE_ERROR رو هم جذب کرد

 

  • دستور ini_set('display_errors', TRUE); 

دستوری برای نمایش خطا هستش. اگر error_reporting خاموش باشه این دستور هم کار نمی کنه. اگر error_reporting روشن باشه ولی این دستور false باشه، اسکریپت کماکان خطاها رو دریافت می کنه اما نمایش نمیده!

 

  • دستور ini_set('log_errors', TRUE); 

دستوری برای ذخیره خطا در فایل هستش. اگر error_reporting خاموش باشه این دستور هم کار نمی کنه. اگر error_reporting روشن باشه ولی این دستور false باشه، اسکریپت کماکان خطاها رو دریافت می کنه اما ذخیره نمی کنه.

 

بنابراین برای نوع development همه باید فعال و true باشن و برای نوع production(تحویل به مشتری) همه باید فعال و true باشن بجز display_errors!

۰ نظر ۹۲/۱۱/۲۲
یوشا آل ایوب

 

چند نمونه از توابعی که در php.ini بهتره Disable بشن:

apache_child_terminate
apache_reset_timeout
unregister_tick_function
rpc
exec
dl
show_source
apache_note
apache_setenv
closelog
debugger_off
debugger_on
define_syslog_variables
escapeshellarg
escapeshellcmd
ini_restore
openlog
passthru
pclose
pcntl_exec
popen
proc_close
proc_get_status
proc_nice
proc_open
proc_terminate
shell_exec
syslog
system
url_exec
۰ نظر ۹۲/۰۶/۱۱
یوشا آل ایوب

/**
 * A hack to support __construct() on PHP 4
 * Hint: descendant classes have no PHP4 class_name() constructors,
 * so this constructor gets called first and calls the top-layer __construct()
 * which (if present) should call parent::__construct()
 *
 * @return Object
 */
function Object()
{
    $arguments = func_get_args();

    if (method_exists($this, '__destruct')) register_shutdown_function(array(&$this, '__destruct'));

    call_user_func_array(array(&$this, '__construct'), $arguments);
    return;
}

https://github.com/felixge/raleigh-workshop-08/blob/master/application/cake/libs/object.php

۱ نظر ۹۲/۰۵/۰۲
یوشا آل ایوب

 

مقایسه سرعت بین توابع is_array/is_string/is_integer... در مقابل تابع GetType

سرعت بیشتر:

$variable = array(1, 2, 3, 4, 5);

if(is_array($variable))
{
    # ...
}

0.00079393386840820
0.00079488754272461
0.00080204010009766
0.00080204010009766
0.00080204010009766
0.00080204010009766
0.00081205368041992
0.00093293190002441
0.00111198425292970
0.00123190879821780

سرعت کمتر:

$variable = array(1, 2, 3, 4, 5);

if(gettype($variable) == 'array')
{
    # ...
}

0.0013110637664795
0.0013110637664795
0.0013139247894287
0.0013139247894287
0.0013179779052734
0.0013198852539062
0.0013239383697510
0.0013329982757568
0.0014750957489014
0.0018458366394043
۰ نظر ۹۲/۰۴/۱۱
یوشا آل ایوب