- آموزش php
- 1401-11-16
- 271
- 0
امکانات جدید نسخه های php هر کدام نسبت به ورژن قبلی
ویژگی های php 8
php 8 آخرین نسخه از زبان برنامه نویسی php است که در 26 نوامبر 2020 ارائه شد. برخی امکانات در این نسخه برای رفع ایرادات مهم نسخه های قبلی ارائه شده است. همچنین یک سری ویژگی های php 8 ، جدید هستند و امکانات جذابی را به این برنامه اضافه کرده اند. در ادامه به بررسی برخی از مهم ترین ویژگی های 8 php می پردازیم برای اینکه بهتر متوجه شوید که امکانات جدید php 8 چیست تا انتهای این مقاله با ما همراه باشید.
Union Type ها اجازه معرفی بیش از یک تایپ (return types ،parameters و class properties) را میدهند.
public function foo(Foo|Bar $input): int|float;
توجه داشته باشید که void هرگز نمیتواند بخشی از یک union type باشد، زیرا "no return value at all" ( هیچ مقدار برگشتی وجود ندارد) را نشان میدهد. به علاوه، nullable union ها میتوانند با استفاده از |null ، یا با ? نوشته شوند.
public function foo(Foo|null $foo): void;
public function bar(?Bar $bar): void;
JIT یا همان Just In Time، امکانی است که قرار بود آن را به php 7.4 اضافه نمایند اما بعدا بنا بر دلایلی نظرشان عوض شد و تصمیم به قرار دادن این ویژگی در نسخه php 8 گرفتند. همانطور که از اسمش مشخص است، وظیفه اصلی آن کامپایل کردن یا در واقع جمع آوری کردن تمام کدهای پروژه ما حین اجراست.
اما ممکن است برایتان سوال پیش بیاید که مگر کدهای php نیازی به کامپایل شدن دارند؟ پاسخ هم بله است هم خیر! چرا که php به صورت مستقیم نیاز به کامپایل کردن کدها ندارد، بلکه تحت فرمان OP cash یکبار کدها را خوانده و جمع آوری می کند و از آن به بعد فقط آنها را صدا می زند.
کاری که JIT انجام می دهد این است که هر زمان شما نیاز به اجرای کدهایتان پیدا کردید آن را به صورت Just In Time یعنی درست در همان زمان کامپایل کرده و به اجرا در می آورد. نه اینکه مانند گذشته فقط یکبار برای بار اول فراخوانی کدها آنها را جمع آوری کند.
آرگومانهای نامدار (Named arguments)
«آرگومانهای نامدار» (Named arguments) امکان ارسال مقادیر به یک تابع را با تعیین نام مقدار فراهم ساختهاند، به طوری که دیگر نیازی به توجه به ترتیب آرگومانها وجود ندارد و میتوانید پارامترهای اختیاری را نیز رد کنید.
function foo(string $a, string $b, ?string $c = null, ?string $d = null)
{ /* … */ }
foo(
b: 'value b',
a: 'value a',
d: 'value d',
);
اگر با اپراتور (null coalescing) کار کرده باشید از قبل با کاستی های آن آشنا هستید. حتماً میدانید که این اپراتور نمیتواند برای متدهایی که فقط یک آبجکت دارند، عمل کند. در صورت استفاده از این عملگر برای متدهای دارای یک آبجکت، با یک خطا تحت عنوان «this method is not defined!» روبرو خواهید شد.
با اضافه شدن عملگر nullsafe، اکنون می توانیم رفتاری شبیه به ادغام تهی روی متد ها داشته باشیم.
$dateAsString = $booking->getStartDate()?->asDateTimeString();
Attributes
Attributes اجازه می دهد تا متا داده ها(meta-data) را برای توابع، کلاس ها، ویژگی ها و پارامترها اعلام کنید. در نسخههای پیشین، برای این کار در حین کد نویسی، از عملگر ‘doc_comments’ استفاده میشد.صفت ها یا attribute ها برای یادداشت نویسی یا اضافه کردن داده های متا در کلاس استفاده می شوند.
/**
* @param string $message
*/
function foo(string $message) {}
#[Attribute]use App\Attributes\ExampleAttribute;
#[ExampleAttribute]
class Foo
{
#[ExampleAttribute]
public const FOO = 'foo';
#[ExampleAttribute]
public $x;
#[ExampleAttribute]
public function foo(#[ExampleAttribute] $bar) { }
}
class ExampleAttribute
{
public $value;
public function __construct($value)
{
$this->value = $value;
}
}
مشکل تابع constructor در شی گرایی در این نسخه برطرف شده است. حال برای اینکه بفهمید این مشکل چیست به مثال زیر دقت کنید:
class Money
{
public Currency $currency;
public int $amount;
public function __construct(
Currency $currency,
int $amount,
) {
$this->currency = $currency;
$this->amount = $amount;
}
}
class Money
{
public function __construct(
public Currency $currency,
public int $amount,
) {}
}
این عبارت را میتوان برادر بزرگتر عبارت switch در نظر گرفت. Match میتواند مقادیر را بازگشت دهد و نیازی به گزارههای break هم ندارد. با بهرهگیری از این عبارت میتوانید شرطها را ترکیب کنید، از ترکیب نوع صریح استفاده کنید و هیچ نوع کاهش نوع نداشته باشید. به مثال زیر توجه کنید:
$result = match($input) {
0 => "hello",
'1', '2', '3' => "world",
};
$foo = new Foo();
var_dump($foo::class);
یک نوع داده ای جدید است که می تواند انواع داده ای زیر را در خود جا دهد.
string|int|float|bool|null|array|object|callable|resource
نوع داده Mixed می تواند آرگومان ورودی یک تابع یا نوع داده خروجی تابع باشد. همچنین می توان از آن بعنوان پارامتر یک کلاس استفاده کرد. این نوع داده ای به شما امکان می دهد متغیرهایی تعریف کنید که هر کدام از این انواع داده ای را بتوانند در خود قرار دهند. مثال:
class Example {
public mixed $exampleProperty;
public function foo(mixed $foo): mixed {}
}
نکته : Mixed نوع داده null را نیز در خود دارد بنابراین نیازی نیست که متغیر خود را nullable تعریف کنید در غیر اینصورت با خطا مواجه می شوید.
تا پیش از این، امکان کامپایل PHP بدون فعالسازی پسوند JSON وجود داشت، اما این موضوع دیگر ممکن نیست. از آنجا که JSON کاربرد بسیار گستردهای دارد، بهتر است که توسعهدهندگان بتوانند به صورت پیشفرض روی آن تکیه کنند، تا این که مجبور باشند ابتدا آن را فعال کنند.
قبل از PHP 8 به این صورت بود که همان بررسیهایی که بر روی متدهای public و protected انجام میشد بر روی private نیز انجام میشد، به عبارت دیگر متدهای private باید همان قوانینی را پیروی کنند که متدهای protected و public پیروی میکردند و از آن جایی که متدهای private درون کلاسهای فرزند در درسترس نیستند این مورد با عقل جور در نمیآید.
Warning: Private methods cannot be final as they are never overridden by other classes
ویژگیهای جدید php 8 : درون Traitها شما میتوانید متدهایی (Method) از نوع abstract ایجاد کنید که هر زمان یک کلاس این traitها را use کرد مجبور به پیاده سازی متد abstract درون trait شود. قبل از PHP 8 امضای (منظور از امضا یا signature همان نوع ورودی و خروجی یک تابع است) پیاده سازی متدهای abstract معتبر نبود. قبلا از PHP 8 به صورت زیر معتبر بود.
trait Test {
abstract public function test(int $input): int;
}
class UsesTrait
{
use Test;
public function test($input)
{
return $input;
}
}
در PHP 8 زمانی که شما میخواهید یک متد abstract برای trait را پیادهسازی کنید، اعتبارسنجی را به شکلی بهتر و به درستی انجام میدهد. پس از PHP 8 به بعد شما میتوانید این گونه این متد را پیاده سازی کنید.
class UsesTrait
{
use Test;
public function test(int $input): int
{
return $input;
}
}
$triggerError = fn () => throw new MyError();
$foo = $bar['offset'] ?? throw new OffsetDoesNotExist('offset');
تابع | تعریف | مثال |
str_contains |
بررسی میکند که آیا needle درون haystack میباشد یا خیر | str_contains('Foobar', 'Foo') |
str_starts_with |
بررسی میکند که آیا needle با رشته haystack آغاز میشود یا خیر | str_starts_with('PHP 8.0', 'PHP') |
str_ends_with |
بررسی میکند که آیا needle با رشته haystack پایان مییابد یا خیر | str_ends_with('PHP 8.0', '8.0') |
PHP 8.0 همچنین توابعی مانند fdiv ،get_resource_id ،get_debug_type و preg_last_error_msg را ارائه کرده است.
تابع | تعریف |
fdiv |
بخش float از استاندارد IEEE-754 در Floating-Point Arithmetic |
get_resource_id |
ID داخلی را برای PHP resource موردنظر برمیگرداند. |
get_debug_type |
type داخلی یک متغیر را برمیگرداند. |
preg_last_error_msg |
پیغام خطای آخرین عملیات preg را برمیگرداند. |
ثبت دیدگاه جدید
0 دیدگاه
نشانی ایمیل شما منتشر نخواهد شد. بخشهای موردنیاز علامتگذاری شدهاند *