هیچ محصولی در سبد خرید نیست.

ثبت‌نام

بررسی تغییرات php8

دوستان و همراهان عزیز به قسمت هفتم جت کد کست خوش اومدین، این قسمت میخوایم به بررسی تغییرات ورژن جدید PHP یعنی PHP8 بپردازیم. همونطور که سایت خود PHP هم گفته، این نسخه، یه Major Update هست که تغییرات زیادی شامل امکانات جدید و بهینه سازی رو در بر میگیره.

قبل از اینکه بخوایم شروع کنیم به بررسی این تغییرات، بزارین یه توضیح خیلی مختصر راجع به خود این زبان برنامه نویسی ارائه بدیم برای دوستانی که آشنایی ندارن. PHP که مخفف PHP Hypertext Processor هست، یه زبان برنامه نویسی از نوع اسکریپتی و مفسریه و برای بک اند وب هست که با C نوشته شده و توسط Rasmus Lerdorf سال 1994 منتشر شده و یه جورایی سال هاست که سر دسته زبان های بک اند برای توسعه هست و الانی که دارم این اپیزود رو ضبط میکنم ورژن 8.0.2 هم ریلیز شده و در دسترسه.

خب حالا بریم سراغ اصل مطلب یعنی بررسی تغییرات PHP8. تو این ورژن ما شاهد تغییرات زیادی در هسته این زبان هستیم که منطقیه چون همونطور که کمی قبل گفتم این یه Major update هست.

از جمله این تغییرات میشه به:

Union Type، NamedArguments, Match Expressions، constructor Property Promotion، Nullsafe Operator, Weak Maps Just In Time Compilation که اهمیت فوق العاده ای در بهینه شدن سرعت این ورژن پی اچ پی داره و حتما بهش می پردازیم.

Named arguments

خب بیاین با Named arguments شروع کنیم. اول از همه بگم که احتمالا میدونید این چه فیچریه چون تو پایتون هم ما داشتیم. در واقع Named arguments همون Keyword parameter هست که ما توی توابعمون میتونیم تعریف کنیم هر آرگومان یا پارامتر چه اسمی داره و بعد موقع صدا زدن اون تابع، مقدایر آرگومان ها رو جلو اسمشون می نویسم.

این فیچر واقعا Life Saver هست و من نمیدونم چرا قبلا اینو نداشتیم. برای من یکی که این قابلیت به تنهایی کافیه برای اینکه پروژه رو به سمت PHP8 هل بدم جلو. چون میدونید دیگه مثلا یه تابع سه تا آرگومان داره که وسطیش اختیاریه! قبلا موقع صدا زدن همچین تابعی باید هر سه آرگومان رو وارد میکردیم و مثلا وسطی رو میتونستیم Null یا Empty String بزنیم و تو فانکشن اینو هندل میکردیم. اما الان میشه آرگومان های اختیاری رو اصلا وارد نکرد و به اصلاح به جای Positional Argument که میگه باید پارامتر ها رو به ترتیب وارد کنی، از روش Named arguments استفاده میکنیم.

مثال PHP7:

htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);

مثال PHP8:

htmlspecialchars($string, double_encode: false);

Constructor property promotion

Constructor property promotion چیه؟ این قابلیت به ما این امکان رو میده که ویژگی های یک کلاس رو با کد کمتری تعریف و مقدار دهی کنیم. به عنوان مثال فرض کنید ما یه کلاس User داریم که یک ویژگی داره به اسم isAdmin و میخوایم پیش فرض false باشه اما اگر موقع ساختن نمونه از کلاس مقداری برای آرگومان isAdmin وارد شده بود، اون مقدار در پراپرتی isAdmin ذخیره بشه.

مثال PHP7:

class User {
  public bool $isAdmin;

  public function __construct(
    bool $isAdmin = false
  ) {
    $this->isAdmin = $isAdmin;
  }
}

مثال PHP8:

class User {
  public function __construct(
    public bool $isAdmin = false
  ) {}
}

برای اینکه بهتر متوجه این ویژگی بشین حتما مقاله مرتبط با این اپیزود رو که لینکش رو توی توضیحات پادکست میزارم مطالعه کنید و به مثال ها دقت کنید.

Union types

به کمک این ویژگی جدید میتونیم چند نوع داده برای یک متغیر تعریف کنیم و اگر نوع داده ی اون متغیر هیچ کدوم از اونها نبود، خطای از نوع Type Error میده. البته قبلا هم میتونستیم این کار رو انجام بدیم اما با استفاده از PHPDoc annotation. الان میشه خیلی راحت میشه از این قابلیت استفاده کرد. چطوری؟ فرض کنید میخایم ویژگی وزن در کلاس User از نوع Int یا Float باشه، برای اینکار میایم از این سینتکس استفاده می کنیم:

class User {
  public function __construct(
    private int|float $weight
  ) {}
}

Match expression

مچ اکسپرشن ها تقریبا شبیه همون Switch ها هستند اما با یه سری تفاوت. شما میتونید رو یه چیزی سوییچ کنید و بگید اگر مقدارش فلان چیز بود این چیز رو برگردون. اما دیگه break نمیخواد و اینکه به ازای هر مچ فقط میتونید یک خط کد بنویسید. اما این خیلی جا ها بدرد میخوره. یه مقال واضحش تبدیل روز های هفته از عدد به متنه. یادتون نره که خروجی این تابع match رو میشه echo کرد، توی یه متغیر ریخت و یا return کرد، چون این یک expression حساب میشه.

echo match(0){
    0 => 'شنبه',
    1 => 'یکشنبه',
    ,...
};
// نتیجه این کد نمایش "شنبه" هست

Nullsafe operator

عملگر نال سیف یکی از فیچر هاییه که کار رو برای توسعه دهنده ها راحت میکنه. فرض کنید شما میخواهید کشور زندگی کاربر رو بگیرید، قبلا برای اینکار اول چک می کردیم آیا $user نال هست یا نه، اگر نال نبود حالا اگر فیلد کشور داخلش هم نال نبود از متغیر $user، آدرس رو و از آدرس، کشور رو میگرفتیم.

مثال PHP7:

if ($user !== null) {
    $address = $user->getAddress();

    if ($address !== null) {
      $country = $address->country;
    }
  }

مثال PHP8:

$country = $user?->getAddress()?->country;

Non-capturing catches

تا قبل از PHP8 اگر میخواستیم به Exception رو بگیری باید توی یه متغیر میریختی مثلا به اسم $error یا $exception، حتی اگر از اون متغیر استفاده هم نمیکردی و صرفا برای هندل کردن خطا بوده. اما الان با استفاده از قابلیت Non-capturing catches این امکان وجود داره که اگر نخواستی اون متغیر رو نسازی.

مثال PHP7:

try {
    // Something goes wrong
} catch (MySpecialException $exception) {
    Log::error("Something went wrong");
}

مثال PHP8:

try {
    // Something goes wrong
} catch (MySpecialException) {
    Log::error("Something went wrong");
}

Trailing comma in parameter lists

از این به بعد میتونید بعد از آخرین آرگومان داخل تابع هم یه کاما بزارین. چیز خاصی نیست اما خوبه که باشه. تو زبان های دیگه مثل پایتون هم ما همچین چیزی رو داریم.

public function add(
    string $name,
    int $age,
) {
    // کد های بدنه تابع
}

تابع str_contains

با استفاده از این تابع میتونید چک کنید آیا درون یک رشته، رشته ی دیگری پیدا میشه یا نه. قبلا این کار رو با strpos میکردیم ولی الان یه تابع مخصوص این کار دست شده که یه Boolean برمیگردونه و خیلی ساده تر شده.

if (str_contains('Test Hello World Test', 'Hello')) { echo "Found!" }

تابع str_starts_with() و str_ends_with()

با استفاده از تابع str_starts_with() میتونیم چک کنیم ابتدای یک رشته، با یه رشته خاصی شروع میشه یا نه. و تابع str_ends_with() هم این کار رو به نسبت آخر یک رشته انجام میده. خروجی این دو تابع Boolean هست و میتونید ازش توی دستورات شرطی و… استفاده کنید.

مثال PHP8:

str_starts_with('haystack', 'hay'); // true
str_ends_with('haystack', 'stack'); // true

از اونجایی که لیست تغییرات این نسخه خصوصا چیزای جزیی زیادن، به سری از تغییرات جزیی و بهبود ها رو به صورت لیست وار مرور میکنیم:

  • Stable sorting
  • Saner string to number comparisons
  • Saner numeric strings
  • Stricter type checks for arithmetic and bitwise operators
  • Concatenation precedence
  • The @ operator no longer silences fatal errors
    روی پروداکشن اگر display_errors=Off رو تنظیم کنید تا اگر قبلا خطایی با @ مخفی شده بوده، الان هم نمایش داده نشه!
  • Consistent type errors
  • New mixed type
  • New static return type

خب از اونجاییکه حرفمون یکم طولانی شد، یه break بدیم و برگردیم راجع به JIT صحبت کنیم.

JIT (The Just in Time Compiler)

JIT یه تکنولوژیه که مثل یه مفسر عادی در زمان اجرا کد ها رو به زبان ماشین تبدیل میکنه اما با این تفاوت که اگر دید یه تیکه کدی چند بار فراخوانی شده سعی میکنه اون رو کش کنه تا پروفرمنس بهتری داشته باشیم و این فرایند بهینه بشه. در نتیجه تکه کد های از قبل کامپایل شده رو در صورتی که تغییر نکرده باشند در زمان اجرا استفاده می کنه.

ظاهرا JIT قراره پروفرمنس بهتری داشته باشه اما در عمل برای نرم افزارهای تحت وب مثل وردپرس، تفاوت چشمگیری در سرعتشون دیده نمیشه. اما JIT بخاطر ساختارش مزایای دیگه ای هم داره و در آبنده میتونه فرصت های خیلی خوبی رو برای زبانی مثل PHP ایجاد کنه. از جمله اینکه Cross platform هست و از این جهت که PHP ادعا میکنه General Purpose هست خب میتونه برای مفید باشه و بتونه از این طریق برای فضای خارج از وب هم خودش رو بهینه تر کنه.

 

خب به همین مقدار بسنده می کنیم. در مورد JIT و فیچر های دیگه ی PHP8 خیلی بیشتر میشه حرف زد اما از طرفی از حوصله ی من و شما تو این پادکست و مقاله خارج میشه و از سمتی دانش فنی بیشتری نیازداره.

امیدوارم مطالب این پادکست و مقاله به کارتون بیاد. مواظب خودتون باشین و پیش به سوی PHP8!

لینک ها و منابع

ساختار کامپایلر چگونه است؟ کامپایلر چطوری کار میکنه؟

مقدمه

قبل از اینکه در مورد ساختار کامپایلر (Compiler) و روش کار کردنش براتون بگم بزارید یکم در مورد اینکه اصلا کامپایلر چیه بیشتر براتون بنویسم.

کامپایلر چیه؟

کامپایلر نرم افزاری که سورس کد رو از یه زبانی به زبان دیگه تبدیل میکنه که غالبا منظور ما نرم افزاریه که از زبان های سطح بالا (High level Programming language) به زبان هایی سطح پایین مثل اسمبلی ترجمه می کنند.

In computing, a compiler is a computer program that translates computer code written in one programming language (the source language) into another language (the target language).

منبع: PC Mag Staff (28 February 2019). “Encyclopedia: Definition of Compiler”. PCMag.com. Retrieved 28 February 2017.

انواع کامپایلر ها

  • اگر برنامه ی کامپایل شده را بتوان در سستیمی با CPU متفاوت از سیستمی که برنامه در آن کامپایل شده اجرا کرد به آن نوع کامپایلر میگیم Cross-Compiler.
  • De-compiler برنامه ایه که میتونید باهاش برنامه ای رو از زبان سطح پایین به یک زبان سطح بالا ترجمه کنید (یعنی بر عکس مترجم های عادی مرسوم)
  • Source to Source Compiler یا Trans-compiler ها یکی از انوع کامپایلر ها هستند که امکان ترجمه یک کد زبان High level به زبان High level دیگه رو به ما میدن.
  • و…

ساختار کامپایلر ها

کامپایلر ها معملا یک ساختار مشترک دارند. یک سری کار ها رو به صورت متوالی انجام میدن تا کد رو از یک زبان سطح بالا (در این نوع کامپایلر های مورد بحث) به زبان ماشین تبدیل کنند. به ترتیب ساختار کامپایلر ها رو با هم دیگه مرور میکنیم و در مورد هر کدوم از مراحل کامپایل توضیحاتی میدم.

Lexical Analyzer

Lexical Analyzer در واقع به معنی واژه یابه و بهش scanner هم میگن که فاز ابتدایی کامپایلر هست. در این مرحله یک سری از خطاها هم که خطاهای Syntax هستند کشف میشن. کامنت ها و فواصل اضافی هم در همین مرحله کاملا حذف میشن و نتیجه میره به مرحله بعد. تو این مرحله کد های از سمت چپ به راست کاراکتر به کاراکتر خونده میشن و به شکل یک سری توکن معنی دار در میان که به مراحل بعد کار کامپایلر کمک می کنند.

کار های اصلی که در این مرحله اتفاق میفته:

  • کامنت ها و فواصل اضافی رو حذف میکنه
  • شناسایی کلمات بر اساس متن سورس کد ورودی
  • دسته بندی کلمات به شناسه های از پیش رزرو شده (مثل if)، ثوابت و…
  • توکن هایی که جزو زبان نیستند رو تشخیص میده

مثال: فرض کنید به کامپایلر کد زیر رو به عنوان ورودی رو بدیم:

;int y = 10

خروجی ما در مرحله اول کامپایلر به این شکله:

Keyword int
Identifier y
Assignment Operator =
Number 10
مثالی از توکن ها
Token name Sample token values
identifier x, color, UP
keyword if, while, return
separator }, (, ;
operator +, <, =
literal true, 6.02e23, "music"
comment /* Retrieves user data */, // must be negative

Syntax Analyzer

بهش Parser هم میگیم. در واقع ساختار کد ها رو تشخیص میده و کد ها رو پارس میکنه. یک درخت پارس از ساختار کد ها رسم میکنه. در این مرحله Syntax بررسی میشه و خطا ها مشخص میشن. بصورت کلی تو این بخش درستی کد نوشته شده بررسی میشه و اگر خطایی از این بابت در کد ها رویت بشه گزارش میشه.

با کمک توکن های ساخته شده در مرحله قبل، بر اساس یک سری قوانین که برای هر زبان برنامه نویسی ممکنه متفاوت باشه Parse Tree رو میسازه.

یک مثال از Parse Tree

کار های اصلی که در این مرحله اتفاق میفته:

  • گرفتن توکن ها از Lexical Analyzer
  • بررسی صحت کد از جنبه ی Syntax
  • گزارش دادن ارور های سینتکس
  • ساختن یک درخت سلسله مراتبی به اسم Parse Tree

Semantic Analyzer

سمانتیک انالایزر معنی دار بودن Parse Tree رو بررسی میکنه و اگر مشکلی نداشت اصطلاحا Parse Tree رو Verify میکنه. یه سری کار های دیگه هم از جمله Type cheeking, label checking انجام میده. برای اینکه بهتر کار Semantic analyzer رو درک کنید اینطوری در نظر بگیرید که تو این مرحله کامپایلر اون درختی که شکلش رو تو مرحله قبل دیدیم بررسی میکنه و بهش از جنبه معنایی نگاه میکنه. اگر مشکلی وجود داشته خطا میده در غیر اینصورت ما رو به مرحله بعدی هدایت میکنه.

کار های اصلی که در این مرحله اتفاق میفته:

  • ذخیره سازی نوع داده ها در Parse Tree یا Symbol Table
  • بررسی نوع داده ها و در صورت عدم تطابق داده و نوع داده (اگر قابل Cast کردن نباشه) ارور Semantic نمایش داده میشه.

توضیح: اگر در مثالی شما نیاز به TypeCast باشد به صورت خودکار در صورت امکان این اتفاق در این مرحله انجام می گیرد. به عنوان مثال:

;float x = 10.5
;float y = x * 2

احتمالا متوجه شدید که در مثال بالا عدد 2 که یک عدد صحیح یا Integer هست قبل از عملیات ضرب به صورت خودکار به یک Float یا عدد اعشار تبدیل میشه. پس اون خط چیزی شبیه این میشه:

;float y = x * 2.0

Intermediate Code Generator

Intermediate Code Generator یعنی سازنده کد میانی (سطح میانی). تا اینجای کار کامپایلر برای همه ی ماشین ها یکسانه و تفاوتی نداره. کد میانی در واقع یک کد انتزاعیه بین زبان برنامه نویسی سطح بالا و زبان ماشین.خوبی این مرحله اینه که کار رو برای ترجمه کد ها به زبان ماشین خیلی ساده تر میکنه.

کار های اصلی که در این مرحله اتفاق میفته:

  • بر اساس Semantic یک برنامه، کد سطح میانی تولید میشه
  • مقادیر رو طی فرایند ترجمه نگه میداره
  • به ترجمه کد به زبان مقصد کمک میکنه
  • حفظ ترتیب و اولویت هایی که در زبان مبدا وجود داشت

به عنوان مثال:

total = count + rate * 5

به کمک Address Code نتیجه میشه:

t1 := int_to_float(5) 
t2 := rate * t1 
t3 := count + t2
total := t3

Code Optimizer

در این پروسه، کد های میانی بهینه میشن (از نظر سرعت، کوتاه تر شدن کد ها، قدرت کم تر خواستن و… ) و خط های اضافی به نحوی حذف میشه و کد ها فشرده تر میشن. (منظور از خط های اضافی خطوط خالی و… نیست اونها که در مراحل قبل حذف شدن). این پروسه باعث میشه کد های کمتر بشن و تا حد ممکن سرعت اجرا بالاتر بره.

Target Code Generator

در این مرحله کد خروجی که برای ماشین قابل خوندنه بر اساس کد سطح میانی که یک کد غیر وابسته به نوع سخت افزار بود تولید میشه. اما کد خروجی زبان مقصد به نوع ماشین (CPU) وابسته است.

منابع

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

لینک حمایت از آموزش ها و پروژه های متن باز

زندگی؛ کرونا؛ قرنطینه و یک عدد برنامه نویس

یکمی درباره ی زندگی در زمان ویروس کرونا و قرنطینه

چرا باید به php7 مهاجرت کنیم؟

مهاجرت به php7 از نون شب براتون واجب تر نیست اما بالاخره مهم که هست 🙂 امروز یا امشب (نمیدونم کی میخونینش پس…) میخوایم بار و بندیلمونو برداریم بریم سمت php7 اما اگه آماده نیستید مساله ای نیست چون اولش کلی دلیل میاریم که چرا باید بریم اون سمتی.

خب بزارین با یه داستان یا همچین چیزی بحث رو شروع کنیم…

چند وقت پیش داشتم روی یه پروژه ی تحت وب به عنوان فریلنسر کار می کردم. بک اندش رو با PHP نوشتم در کل بر اساس استاندارد های php7 کد ها رو نوشتم اما روی هاست با PHP5.3 اجرا می شد.

یکی از مشکلاتی که برخوردیم بحث سرعت پردازش بود. با توجه به نوع پروژه (حسابداری تحت وب | صندوقداری) بود، نیاز بود که الگوریتم های محاسباتی داشته باشه و وقتی روی پروداکشن داشتیم با یه سری داده های تستی برای کنترل و آزمایش نرم افزار کار می کردیم متوجه شدیم که سرعت اجرای نرم افزار خیلی کنده.

حتی بعضی وقتا (خصوصا قسمتی که الگوریتم محاسبات روی تعداد زیادی Entry اپلای می شد) سایت time out میداد که مشکلات زیادی درست میکرد.

اولش با بالا برن execution_time توی تنظیمات php.ini هاست دایرکت ادمین تونستیم مقداری قضیه رو بهتر کنیم اما هنوز مسأله سر جاش بود.

راه حل؟ اولش اومدم یکبار الگوریتم رو بررسی کردم تا ببینم میشه کاری کرد که سریعتر اجرا بشه. دیدم چیزی در نیومد.
رفتم سراغ تنظیمات دایرکت ادمین و دیدم که گزینه ای داره برای انتخاب ورژن PHP، ورژن php رو روی 7.3 قرار دادم (الان که مقاله روی مینویسم تا 7.4.5 هم اومده که یه سری باگ فیکس و مشکلات امنیتی بوده اما هنوز شرکت روی سرورش نصب نکرده). نتیجه فوق العاده بود.

سرعت اجرا تا حدود 50% بیشتر شد. یعنی دو برابر!

این قضیه موقع انتشار ورژن 7 گفته شد و تاکید شد که حتما به این ورژن سوییچ کنید. (البته در نظر داشته باشید که یه سری چیز ها هم deprecate شدن و شما باید کدتون رو ریفکتور کنین).

حالا بریم یه سری به تغییرات php7 نسبت به php5 بزنیم.

php7

برخی از ویژگی های php7

Performance بیشتر

یکی از مهم ترین تغییرات این نسخه در مورد پروفرمنس بیشتر این نسخه هیچ شکی نیست و میتونید یه سرچی بزنید و خودتون ببینید که واقعا چقدر نسبت به ورژن قبلی پیشرفت داشته. دلیلش هم استفاده از ورژن جدید Zend Engine هست. اگر نمیدونید Zend Engine چیه اینجا کلیک کنید.

یعنی همین که شما از interpretter جدید تر php استفاده می کنید باعث میشه سرعت سایت یا وب اپلیکیشنتون بره بالا.

As per Zend Technologies, the performance improvement is huge!! Just upgrading to PHP 7 gives enormous performance upgrades. Hence, PHP 7 is often termed PHPNG (PHP – Next Gen) taking the performance of your code to a whole new level.

وب سایت geeksforgeeks

Scalar Type Hints

یعنی شما میتونید به آرگومان های تابع یا متودتون نوع بدین و بگین حتما باید از این نوع باشن. اگر خط زیر رو اول فایلتون بنویسید strict_type فعال میشه و اگر نوع داده ی ورودی با نوع داده ی آرگومان تابع شما همخوانی نداشته باشه خطا میده.

بزارین یه مثال بزنیم. فرض کنید میخوایم یه تابع داشته باشیم برای جمع کردن دو تا عدد صحیح.

<?php
declare(strict_types = 1);
function sum(int $x, int $y)
{
 return $x + $y;
}
$sum = sum("10","20");
?>

از اونجایی که من تعیین کردم که php حساس و سخت گیر باشه در نتیجه به من خطا میده. چون من گفتم ارگومان های a , b باید integer باشن اما خودم رشته بهش دادم. پس ارور میده. در واقع خطایی که بهتون نشون میده چیزی شبیه اینه:

Uncaught TypeError: Argument 1 passed to sum() must be of the type int, string given

تعریف نوع داده ی بازگشتی

اگر با php کار کردین میدونید که توی نسخه ی های قدیمی تر امکان تعریف یک نوع داده بازگشتی برای یه تابع یا متد وجود نداشت و این گاها میتونست یه سری دردسر هایی برای برنامه نویس ها ایجاد بکنه. خوشبختانه توی نسخه ی جدید این امکان وجود داره که نوع داده ای که از یه تابع بر میگرده (return value) رو تعیین کنیم.

به عنوان مثال توی تابع زیر سن رو (یه عد صحیح) میگیریم و چک میکنیم اگر 18 یا بالاتر بود نتیحه رو true بر میگردونیم در غیر اینصورت false برگشت داده میشه:

<?php
function isValid(int $age):bool{
    if($age >= 18){
        return true;
    }
    else{
        return false;
    }
}
?>

در واقع شما میتونید از چهار نوع داده bool, int, string, and float برای return کردن استفاده کنید.

پشتیبانی از اعداد صحیح 64 bit

 

مدیریت خطا (Error handling)

PHP 7 changes how most errors are reported by PHP. Instead of reporting errors through the traditional error reporting mechanism used by PHP 5, most errors are now reported by throwing Error exceptions.

php.net

طبق گفته ی سایت رسمی خود php؛ شیوه ی گزارش خیلی از خطاها تغییر کرده اند. بجای گزارش ارور ها به شکل قدیمی که تو نسخه های php5 و… میدیدیم؛ بیشتر خطا ها توسط Exception ها میان بالا (به عبارتی).

در این مورد اینجا هم توضیحات خوبی داده شده.

Anonymous Class

کلاس های Anonymous یا ناشناس کلاس هایی هستند که اسم ندارند. تو php7 این امکان وجود داره که با استفاده از کلمه کلیدی new class یه کلاس ناشناس بسازیم.
برای مثال و فهمیدم عمیق این موضوع مقاله ی زیر رو پیشنهاد میکنم:
https://blog.eduonix.com/web-programming-tutorials/learn-working-anonymous-classes-php-7/

عملگر های جدید

عملگر < = > یا space ship operator یه عملگر جدید توی php7 هست و قبلا توی php نداشتیمش. از اونجایی که یه چیز جدیده (جدید به نسبت نسخه های قبل) یکم بیشتر توضیح میدم. بقول خودشون کارش مقایسه ی ترکیبیه. حالا پرسش ما اینه که اساسا combined comparison یا مقایسه ی ترکیبی یعنی چی و چه کاری برای ما انجام میده؟!

نحوه ی کار به این شکله:

اگر هر مقادیر دو سمت (یعنی عملوند ها) با هم برابر بودند 0 بر میگردونه

اگر مقدار سمت چپ بزرگتر بود 1 رو بر میگردونه

اگر مقدار سمت راست بزرگتر بود 1- بر میگردونه

مثال:

<?php
 // Comparing Integers
echo 1 <=> 1; // outputs 0
echo 3 <=> 4; // outputs -1
echo 4 <=> 3; // outputs 1

// String Comparison
echo "a" <=> "a"; // outputs 0 
echo "m" <=> "y"; // outputs -1
echo "y" <=> "c"; // outputs 1
?>

در آخر اینم بگم که یه سری چیز ها بطور کلی از php7 حذف شده اند. مثلا یه سری تگ شبیه asp که میشه یه چیزی شبیه <% و غیره که میتونید اینجا ببیندشون.

منابع:

 

اگر دوست داشتین میتونید از دسته بندی برنامه نویسی چیز های بیشتری در این باره بخونید یا آموزش هایی رو ببینید.

برای حمایت میتونید کلیک کنید.

تجربه ی کار با Thread در سی شارپ

تجربه ی کار با Thread در سی شارپ

سلام. امروز داشتیم رو یه پروژه ی نرم افزار ویندوزی که با سی شارپ نوشتیم کار می کردیم برای اپدیتش؛ یه مشکلی داشتیم. مسئله اینجا بود که میخواستیم طرف ببینه اینترنتش وصله یا قطعه اگه وصل بود با رنگ سبز بنویسه مثلا “به اینترنت متصل هستید” یا “اینترنت قطع هست”. ایده ی کلی چیز ساده ای بود که خب تو ورژن قبلی با یه timer که interval ش رو روی ۳۰۰۰۰ میلی ثانیه گزاشته بودیم حل شد تقریبا. ولی چون موقع لود شدن برنامه تا سی ثانیه بعد نتیجه رو نمایش نمیداد مجبور شدیم روی رویداد Form Load فرم هم اون تابعی که برای بررسی اصال به اینترنت نوشته بودیم رو صدا بزنیم.

ولی مشکل این بود که وقتی برنامه رو باز می کردیم چون یه پینگی از یه جا می گرفت یکم طول میداد و توی اون لحظه (تقریبا ۱ الی ۲ ثانیه) من نمیتونستم کاری بکنم یعنی اون برنامه درگیره. خب برای اینکار ایده ی Background Worker رو داشتم و از قبل میدونستم که همچین چیزی هست. میشه یه Thread جدید درست کرد که تو یه حلقه با شرط Trueتا بینهایت یه کاری بکنه اما سیستم هنگ نباشه. در واقع توی بک گراند این کار رو بکنه.

توی رویداد لود فرم اصلی این کد رو گزاشتم تا یه Task به Background Worker معرفی کنم و گفتم انجامش بده.

[code] backgroundWorker1.DoWork += backgroundWorker1_DoWork; backgroundWorker1.RunWorkerAsync(); [/code]

بعد توی خود Background Worker اومدم کدهایی کی میخوام هی اجرا بشن رو نوشتم.

[code] private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { while (true) { // check inrternet connection Netchecker netchecker = new Netchecker(); if (netchecker.CheckForInternetConnection()) { netIsConnect = true; } else { netIsConnect = false; } Thread.Sleep(10000); } } [/code]

در واقع یه کلاس نوشتم که توش یه متد netchecker هست برای بررسی وصعیت اینترنت که نهایتا True و False برمیگردونه. و توی این خط ها اومدم چک کردم اگر نتیجش True بود توی یه متغیر true میریزم. بعد توی یک تایمر هر چند ثانیه فقط مقدار اون متغیرو چک می کنم و یه پیام توی یک لیبل نمایش میدم. همین.

اینطوری برنامه خیلی سریعتر شده و کار ها موازی با هم پیش میرن. این کارو خیلی جاها لازمه انجام بدیم تا برنامه کند نشه و یه سری کار ها توی بک گراند انجام بشن.

خب تجربه ی جالبی بود برام. من تخصصم سی شارپ نیست ولی برنامه نویس باید بتونه هر زبونه که نیاز داره رو یادبگیره و ازش لذت ببره و کار بقیه رو هم راه بندازه و از این طریق درامد داشته باشه.

Thread در سی شارپ

Thread در سی شارپ
اینم یه عکس که شاید از حرفای من واضح تر باشه براتون 🙂

شاد و پیروز و البته سلامت باشد.

 

 

چیستی «انسانِ» پیچیده و ارتباط آن با ماهیت برنامه نویسی

چیستی انسان پیچیده و ارتباط آن با ماهیت برنامه نویسی

انسان ها احتمالا یکی از پیچیده ترین موجودات این عالم هستند. چرا که موجودیتشان شامل بسیاری چیز ها و عناصر مختلفی می شود و ویژگی های بسیار دارند. از تک تک اتم های بدنشان گرفته تا افکار، رفتار، موجودیت های فیزیکیشان در دنیا، روابطشان، وابستگی هایشان، تک تک واژگان و حرف هایی که می زنند، امید ها، آرزو ها، حسرت ها، تجارب، احساساتشان، دارایی ها ندارایی هایشان و کلی چیز های دیگر که از شمارش خارج است؛ یا به گونه ای من اینطور فکر می کنم.

چیستی انسان پیچیده با ماهیت برنامه نویسی: انسان موجود عجیبی است. در کل یک موجود است با یک سری Entity و مشخصه که به تعداد خیلی زیادی Fork شده است. انگاری یک کلاس خیلی بزرگ که Clone شده باشد و انقدر بزرگ است که برای پردازش هر «انسان» نیاز به ابر رایانه ها و البته پردازش عمیق است.

در کل اگر نگاه شیئ گرایانه داشته باشید و یک برنامه نویس حرفه ای و کار کشته باشید، میدانید چه می گویم. کلا بنظر من شیء گرایی به ما در ترسیم یک جهان کمک می کند. فرض کنید یک انسان یک کلاس است با ویژگی های مختلف به عنوان متغیر، چیز هایی هم به عنوان ثابت، مانند تاریخ تولد و…، یک سری متد یا فانکشن؛ به عنوان مثال راه رفتن، غذا خوردن، نوشتن و… .

اولین بار که این نگاه را به دنیا داشتم در هنرستان بود. درس Adobe Flash ، یک چیزی داشت عین یک Object. هر شیء میتونست جدا گانه کار بکنه. تصور بکنید یک ماشین که خودش یک شیء است و کلی شیء زیر مجموعه داره. مثل لامپ، لاستیک، فرمان و… . این دنیای Object Oriented دنیای بسیار زیبایی است و نگاه جالبی رو به نسبت جهان به ما میده.

جالب اینکه مبحثی وجود داره به اسم وراثت یا Inheritance که در برنامه نویسی شیء گرا بسیار کاربرد داره. در این مواقع ما از موجودیت ها و متد های یک کلاس میتوانیم به کلاس های فرزند هم بدهیم یعنی عملا بحث توارث مطرح است.

یکی از چیز هایی که برنامه نویسی به ما می آموزد «منطق» است. برنامه نویسی صبحت کردن با یک سیستم با قابلیت برنامه ریزی است. ما به سیستم می گوییم چه کار بکند. البته در مباحث هوش مصنوعی چیز های بسیار پیچیده تر می شوند. کامپیوتر بشدت منطقی است. یعنی اگر شما به سیستم خود دستور بدهید خاموش شو، بدون اینکه در نظر بگیرد شوخی کرده اید یا نه اطاعت امر می کند.

جالب است نه؟! (بیشتر…)

ذهنیت برنامه نویسی واقعا چیست؟

براستی ذهنیت برنامه نویسی چیست و چه تفاوتی با کد نویسی دارد؟! برنامه نویس به چه کسی گفته می شود و یک برنامه نویس باید چگونه فکر کند؟

آموزش ساخت ماشین حساب ساده با پایتون

سلام?، در این قسمت از آموزش های پروژه محور پایتون با شما هستیم تا یک ماشین حساب پایتون رو بصورت خیلی ساده پیاده سازی کنیم. اول از همه باید بدونیم این برنامه ای که می خوایم بنویسیم چه کار هایی قراره انجام بده. همونطور که از اسمش هم پیداست قراره یه سری عددو (اینجا برای سادگی فقط 2 عدد) با هم جمع، تفریق، ضرب و تقسیم کنیم. یه همین سادگی.

نکته: قراره بصورت functional کد بنویسیم. یعنی کد های هر قسمتو بصورت جداگانه بنویسیم و بعد فراخوانی کنیم. مثلا ماژول جمع زدن، تفریق و… رو می نویسیم بعد تو هسته ی اصلی برنامه فراخوانی می کنیم.

خب  چون کارمون با حساب و کتابه همون اول برنامه میایم کتابخونه ی math پایتون رو که برای محاسبات ریاضی هستش رو include می کنیم.

from math import *

بعدش یه پیام خوش آمد گویی برای استارت برنامه می نویسیم.

print ("Hello sir! welcome to Rabbit calculator...")

خب حالا نوبت به تعریف یه فانکشن برای منوی برنامه است. می خوایم لیستی از کارهایی که میشه رو بعلاوه ی operator هایی که کاربر باید بزنه تا اون کار انجام بشه رو وارد کنیم.

def options():
   print("------------------------------------------------------------------")
   print("Options: ")
   print ("------------------------------------------------------------------")
   print("Enter '+' to add two numbers")
   print("Enter '-' to subtract two numbers")
   print("Enter '*' to multiply two numbers")
   print("Enter '/' to divide two numbers")
   print("Enter '**' to power two numbers")
   print("Enter '&' to square root ")
   print("Enter 'exit' to exit the calculator")
   print("------------------------------------------------------------------")

حالا توابع جمع، ضرب و… رو می نویسیم.

#divide function
def divide():
try:
num1, num2 = float(input("Enter first number: ")), float(input("Enter second number: "))
result = num1 / num2
print("The answer: ", result,"\n")
except ZeroDivisionError:
print ("Error: division by zero is not possible!")
divide()
finally:
x = input ("wanna continue? (y/n) ")
if x == "y" or x == "Y":
divide()
else:
exit


#Add function
def add():
try:
num1,num2 = float(input("Enter first number: ")),float(input("Enter second number: "))
result = num1 + num2
print ("The answer: ",result,"\n")
except:
print ("An error ooccured!")
finally:
r = input ("wanna continue? (y/n) ")
if r == "y" or r == "Y":
add()
else:
exit
#Subtract function
def subtract():
try:
num1, num2 = float(input("Enter first number: ")), float(input("Enter second number: "))
result = num1 - num2
print("The answer: ", result,"\n")
except:
print ("An error ooccured!")
finally:
z = input ("wanna continue? (y/n) ")
if z == "y" or z == "Y":
subtract()
else:
exit

#Multiply function
def multiply():
try:
num1, num2 = float(input("Enter first number: ")), float(input("Enter second number: "))
result = num1 * num2
print("The answer: ", result,"\n")
except:
print ("An error ooccured!")
finally:
y = input ("wanna continue? (y/n) ")
if y == "y" or y == "Y":
multiply()
else:
exit

#Power function
def power():
try:
num1, num2 = float(input("Enter first number: ")), float(input("Enter second number: "))
result = num1 ** num2
print("The answer: ", result, "\n")
del (result)
except:
print ("An error ooccured!")
finally:
a = input ("wanna continue? (y/n) ")
if a == "y" or a == "Y":
power()
else:
exit
#Square root function
def square_root():
try:
num1 = float(input("Enter Your number: "))
result = sqrt(num1)
print("The answer: ",result)
except:
print ("An error ooccured!")
finally:
b = input ("wanna continue? (y/n) ")
if b == "y" or b == "Y":
square_root()
else:
exit

حالا کد های اصلی برنامه رو که توش همه ی فانکشن ها رو فراخوانی کردیمو می نویسیم:

#Base codes
while True:
options()
try:
u_in = input("Enter Your command: ")
if u_in == "exit" or u_in == "Exit" or u_in == "quit" or u_in == "Quit":
print("Good bye!\n------------------------------------------------------------------")
break
elif u_in == "+":
add()
elif u_in == "-":
subtract()
elif u_in == "*":
multiply()
elif u_in == "/":
divide()
elif u_in == "**":
power()
elif u_in == "&amp;amp;amp;amp;":
square_root()
else:
print ("check your input!\n")
except:
print ("An error ooccured!")

#Show all errors
raise

نکات:

  • while True: یعنی تا بینهایت همینجوری اجرا بشه. چون شرطش برقراره.
  • کد ها رو تو try گذاشتم تا اگه مشکلی تو اجراش پیش اومد بیام با دستور except یه متنی رو که خودم نوشتم به عنوان ارور نشون بده.
  • دستور raise میاد ارور ها رو نشون میده. (در واقع تو انگلیسی هم raise به معنای بالا آوردنه)

دوستان هرکدوم از دستورات رو که نمتوجه نشدید میتونید همین پایین کامنت بزارید.

موفق باشید

لینک ها:

#iguru_soc_icon_wrap_63878b0b228a1 a{ background: transparent; }#iguru_soc_icon_wrap_63878b0b228a1 a:hover{ background: transparent; border-color: #00bda6; }#iguru_soc_icon_wrap_63878b0b228a1 a{ color: #acacae; }#iguru_soc_icon_wrap_63878b0b228a1 a:hover{ color: #ffffff; }