| AmirHossein | – Telegram
| AmirHossein |
591 subscribers
44 photos
8 videos
2 files
73 links
نوشته‌های یک برنامه‌نویس ناشی

🫂 @StartUnity
Download Telegram
DevDashers
PHPProfessionalTipsSecrets.pdf
#Book #PHP #PDF

حقیقتا کتاب خیلی جامع و کاملیه
اگه علاقه به مطالعه داشتید پیشنهاد میشه
تمامی مباحث رو توضیح داده تو نگاهی که من انداختم
حجمشم خیلی زیاد نیست
👍1
#PHP #OOP
کلاس انتزاعی یا Abstract Class :
گونه ایی از کلاس ها می باشد که نمیتوان از آن شئ ساخت و آن را به عنوان پایه ایی برای کلاس های فرزند آن در نظر میگیرند.
در Abstract Class ها به جز متد های عادی میتوان Abstract Method هم تعریف کرد.

شیوه تعریف این کلاس ها به صورت زیر می باشد:
abstract class Fruit {

}
و برای تعریف Abstract Method ها باید توجه داشته باشید که بدون بدنه تعریف می شوند و تنها نام و ورودی های تابع مشخص شود. مثال:
abstract public function banana();

و در نهایت شکل کامل یک Abstract Class به این صورت می باشد:
abstract class Fruit {
abstract public function color();
abstract public function price();
abstract public function taste();
}

و سپس با extends کردن آن به کلاس مورد نظر استفاده می شود:

class Banana extends Fruit {
public function color() {
return 'yellow';
}
public function price() {
return '1$';';
}
public function taste() {
return 'sweet';
}
}

می‌توان یک Abstract class برای تعریف یک قالب پایه استفاده کرد که قراردادی را بین کلاس‌های فرزند ایجاد کند.
با تعریف Abstract Method، مشخص می‌شود که کلاس‌های فرزند باید متدهای خاصی را پیاده‌سازی کنند.
استفاده از Abstract class به شما امکان می‌دهد که به صورت پلی‌مورفیک با کلاس‌های فرزند برخورد کنید.

مثال های بالا با زبان PHP هستند، اما پایه و اساس Abstract class در همه ی زبان ها به همین صورت هستند و تنها در مواردی سینتکس آنها متفاوت است.
🔥4👍3
#PHP #OOP
اینترفیس یا interface :
اینترفیس ها شبیه به abstract class ها هستند، اما در برخی موارد تفاوت هایی دارند که به آن ها می پردازیم.
در ابتدا روش استفاده از interface ها را مورد بررسی قرار می دهیم:
برای تعریف یک interface به صورت زیر عمل می کنیم:
interface Fruit{

}
و برای تعریف توابع ها همانند abstract class متد هایی بدون بدنه تعریف می کنیم:
public function color();
و در نهایت شکل کلی یک interface به صورت زیر است:
interface Fruit {
public function color();
public function price();
public function taste();
}
برای ارث بری آن از کلیدواژه implements استفاده می شود و به صورت زیر مورد استفاده قرار می گیرد:
class Banana implements Fruit {
public function color() {
return 'yellow';
}
public function price() {
return '1$';';
}
public function taste() {
return 'sweet';
}
}

و اما تفاوت های interface و abstract class :
1- در interface ها تنها می توان توابع بدون بدنه تعریف کرد با این تفاوت که در abstract class ها علاوه برا توابع بدون بدنه توابع دارای بدنه نیز می توان تعریف کرد.
2- هر کلاس تنها می تواند یک abstract class را extends کند ولی در interface ها این گونه نیست و می توان چندین interface را implements کرد.
3- در interface ها تنها می توان متد های بدون بدنه و خالص تعریف کرد ولی در abstract class ها می توان متغییر و خصوصیات را نیز تعریف کرد.


چه موقع از آنها استفاده کنیم؟
زمانی که قراردادها را برای کلاس‌های مختلف تعریف می‌کنید و تنها نیاز به تعریف متدهای خالص بدون بدنه دارید، از interface استفاده کنید.
اما در صورتی که می‌خواهید یک کلاس پایه بسازید که خود آن تعدادی متد نیز داشته باشد و همچنین به کلاس‌های زیرمجموعه اجازه دهید برخی از متدها را پیاده‌سازی کنند، از abstract class استفاده کنید.

مثال های بالا با زبان PHP هستند، اما پایه و اساس interface در همه ی زبان ها به همین صورت هستند و تنها در مواردی سینتکس آنها متفاوت است.
🔥3👍1
#خبر

مثل اینکه مشکل github بر طرف شده!
شما هم چک بکنید.
👍1
#PHP #OOP
تِرِیت یا trait چیست:
در ادامه مبحث شئ گرایی به بحث trait ها می رسیم.
تریت ها به شما این امکان را می دهند تا متد هایی که می خواهید در چندین کلاس استفاده کنید را به صورت جداگانه در بخشی دیگر تعریف کنید و در کلاس های مختلف استفاده کنید.
به عنوان مثال شما متدی به نام getColor دارید و می خواهید در دو کلاس Fruit و Vegetables استفاده کنید، در این موقعیت شما با استفاده از trait یک بار متد getColor را تعریف می کنید و در این دو کلاس use می کنید. مثال:
trait Color{
public function getColor(){
return 'red';
}
}

class Fruit{
use Color;
public function chery(){
return $this->getCollor();
}
}

class Vegetables{
use Color;
public function tomato(){
return $this->getCollor();
}
}

در این نمونه شما با یک بار تعریف یک متد در دو یا چند کلاس از آن استفاده کردید و از نوشتن کد های اضافی جلوگیری کردید.

مثال های بالا با زبان PHP هستند، اما پایه و اساس trait در همه ی زبان ها به همین صورت هستند و تنها در مواردی سینتکس آنها متفاوت است.
1👍1🔥11
عبارت match که از php ورژن 8.0 به بعد در دسترس قرار داره همونطور که از اسمش پیدا هست برای match کردن یا تطبیق دادن دو مقدار با هم استفاده میشه، میشه گفت همون switch case هست.
اما نسبت به switch case تفاوت هایی داره،
به عنوان مثال برخلاف switch case که از == برای مقایسه استفاده می کنه، عبارت match از === استفاده می کنه.
از لحاظ پرفورمنس چند تا تست گرفتم و تفاوت آنچنانی ندارن ولی خب match بسیار کوتاه تر و خوانا تر هست و با دقت بیشتر.

در پایان ساختارش به صورت زیر هست:
$number = rand(0, 5);
echo match ($number) {
1 => 'number 1',
2 => 'number 2',
3 => 'number 3',
4 => 'number 4',
default => 'another number',
};

کد بالا با switch case به صورت زیر هست:
$number = rand(0, 5);
switch ($number){
case 1:
echo 'number 1';
break;
case 2:
echo 'number 2';
break;
case 3:
echo 'number 3';
break;
case 4:
echo 'number 4';
break;
default:
echo 'another number';
break;
}

همونطور که می بینید بسیار کوتا تر و خوانا تر هست.
🔥31👍1
در رابطه با پست دیروز برخی از دوستان گفته بودند که match بدرد بخور نیست و برخلاف switch case که میشه به ازای هر case تعداد زیادی دستور اجرا کنیم در match فقط میشه تعدادی دستور محدود رو اجرا کرد، ولی خب چنین چیزی صحت نداره.
بریم با هم دیگه بررسیش بکنیم:

گفتیم که در switch case به ازای هر case دستورات زیادی میشه اجرا کرد، مثال :
switch (1){
case 1:
$a = 10;
$b = 20;
$c = 30;
echo 'hello';
echo 'bye';
return null;
}
در مثال بالا 6 عمل تنها در یک case اجرا میشه، ولی داخل match به این صورت نمی تونیم دستورات رو پشت سر هم بنویسیم.
ولی حل این مشکل راه های زیادی داره و میریم که چند تا راهش رو ببینیم:

راه حل اول : داخل index های match یک anonymous functions پاس میدیم و کار هایی که میخوایم بکنیم رو داخلش می نویسیم و سپس match رو داخل یک متغییر میریزیم و متغییر رو به عنوان تابع صدا می زنیم:
$do = match (1){
1=> function (){
echo 'hello';
echo 'bye';
return null;
}
};
$do();

راه حل دوم anonymous functions رو داخل match صدا میزنیم:
match (1){
1=> (function (){
echo 'hello ';
})()
};

راه حل سوم یک تابع تعریف می کنیم و کار هایی که می خوایم بکنیم رو داخلش می نویسیم و تابع رو داخل match صدا میزنیم:
function test(){
echo 'hello ';
}

$do = match (1){
1=> test()
};

راه حل های بیشتری میتونه وجود داشته باشه و یک برنامه نویس خوب بهترین راه و کوتاه ترین راه رو پیدا می کنه.
در کل اومدن match داخل php دلیل بر این نیست که نباید از switch case استفاده کنیم، شما هستید که تصمیم می گیرید در چه موقعی از کدومشون استفاده کنید.
مطالب بیشتر رو از دو رفرنس زیر میتونید دنبال کنید:
داکیومنت php
تفاوت های switch case و match
.
👍5👏1
فضای نام یا namespace :
به شما این امکان می‌دهد که کد های خود را سازماندهی کنید و از تداخل نام کلاس ها، تابع ها، ثابت ها و... جلوگیری کنید، یعنی اگر در پروژه خود به عنوان مثال دو کلاس با نام های MyClass داشته باشید با استفاده از namespace ها آنها را از یکدیگر جدا می کنید.
نکته: namespace باید در ابتدای کد ها قرار گیرد و قبل از آن چیزی نوشته نشود.
مثال:
1.php

<?php
namespace App\Folder1;

class MyClass{

}
———————-
2.php

<?php
namespace App\Folder2;

class MyClass{

}
تا اینجا شما در دو فایل متفاوت کلاس های هم نام ساخته اید اما به واسطه namespace متفاوت آنها این دو کلاس از یکدیگر متمایز می شوند.
برای استفاده از این کلاس ها کافیست نام namespace و سپس نام کلاس را بنویسید، مثال:
new App\Folder1\MyClass;
new App\Folder2\MyClass;
یا اینکه ابتدا با کلمه کلیدی use آنها را صدا زده و سپس استفاده کنید، مثال:
use App\Folder1;
new MyClass;
برای استفاده از تابع ها با namespace از کله کلیدی use function استفاده می شود:
use function App\myFunction;
myFunction();
و برای استفاده از constant ها از use const:
use const App\A;
echo A;

مورد بعدی alias ها یا نام مستعار برای use کردن هست که به شما این امکان رو میدهد تا namespace خود را با یک نام دیگر وارد کنید این کار می تواند برای کوتاه کردن namespace های طولانی یا تغییر نام به نام دلخواه به کار رود و کافی است عبارت as و سپس نام دلخواه را بعد از namespace وارد کنید، مثال:
use App\Folder1\MyClass as MyAlias;
new MyAlias();
در این قسمت App\Folder1\MyClass با نام مستعار MyAlias مورد استفاده قرار گرفته است.
.
👍4🤔1
#magic_method #oop #php
مجیک متد یا Magic Method در PHP:
مجیک متد ها، متدهای خاصی هستند که در صورت انجام اقدامات خاصی بر روی یک شی، عملکرد پیش‌فرض PHP را لغو می‌کنند.
مجیک متد ها تنها درون کلاس ها، اینترفیس ها و تریت ها در دسترس هستند.

لیست مجیک متد های PHP به شرح زیر است:
__construct()
__destruct()
—————————
__call()
__callStatic()
—————————
__get()
__set()
__isset()
__unset()
—————————
__sleep()
__wakeup()
—————————
__serialize()
__unserialize()
—————————
__toString()
—————————
__invoke()
—————————
__set_state()
—————————
__clone()
—————————
__debugInfo()

چند پست بعدی کانال به توضیح نسبتا کاملی از کاربرد این مجیک متد ها اختصاص داده می شود.
.
👍3🔥1
#magic_method #oop #php
توابع __construct() و __destruct()

این دو متد از مهم ترین مجیک متد ها هستند به خصوص __construct() و می توان گفت مخالف یکدیگر هستند.
مجیک متد __construct() عملیاتی را در هنگام ساخته شدن یک شئ و مجیک متد __destruct() عملیاتی را در هنگام نابودی یک شئ انجام می دهند.

مجیک متد __construct() برای انجام تنظیمات اولیه و مقدماتی شئ استفاده شود. به طور کلی، در این تابع، متغیرها و ویژگی‌های شیء مقداردهی اولیه می‌شوند و عملیاتی که قبل از استفاده از شئ نیاز است انجام شود انجام می‌گیرد.
این مجیک متد می تواند ورودی داشته باشد و تعداد ورودی ها نا محدود هستند.
مثال:
class Fruit {
public $name;

public function __construct($name) {
$this->name = $name;
}
}

$fruit = new
Fruit
("banana");

در این مثال هنگام ساخته شدن شی Fruit ورودی به نام banana وارد
construct
می شود و داخل
public $name
ذخیره می شود.تمام این عملیات هنگام ساخت شئ انجام می شود و بعد از آن
$name
با مقدار banana در دسترس است.
———————————-
تابع __destruct() در هنگام حذف یک شئ از حافظه، فراخوانی می‌شود و می‌تواند برای انجام عملیاتی قبل از حذف شئ مورد استفاده قرار بگیرد. مثلا می‌تواند برای آزادسازی منابع خارجی مانند فایل‌ها یا پایگاه‌داده‌ها استفاده شود.
مثال:
class Fruit {
public $name;

public function __construct($name) {
$this->name = $name;
}

public function __destruct() {
echo $this->name . " is being deleted.";
}
}

$
fruit
= new Fruit("banana");
unset($
fruit
);

در مثال بالا در هنگام ساخت شئ متغیری با مقدار banana مقدار دهی میشود.
پس از unset کردن، شئ ما نابود و حذف شده در نتیجه در این مرحله destruct صدا زده می شود.
در مثال بالا اگر شئ ما unset نشود باز هم destruct اجرا می شود، زیرا کلاس ما عملیاتی برای انجام ندارد و در نتیجه نابود می شود و برنامه به اتمام می رسد. در نتیجه در این مرحله باز هم destruct اجرا می شود.
.
👍2
#magic_method #oop #php
دو مجیک متد مهم دیگر در php متد های __call() و __callStatic() هستند.
این متدها به شما اجازه می‌دهند تا به طور پویا و در زمان اجرا، تماس با متدهای نامعتبر یا غیرموجود یک کلاس را کنترل کنید.

متد __call() : این متد برای تماس با متدهای نامعتبر یا غیرموجود در یک شئ به کار می‌رود. وقتی یک متد نامعتبر فراخوانی می‌شود، متد __call() فراخوانی می‌شود و شما می‌توانید عملیات مربوط به این فراخوانی را در آن تعریف کنید.
متد __call() دو پارامتر دریافت می‌کند: نام متد فراخوانی شده و آرگومان‌های متد. شما می‌توانید با استفاده از این دو پارامتر عملیات دلخواه خود را انجام دهید.
مثال :
class ّFruit {
public function __call($name, $arguments) {
echo "Calling method '$name' with arguments: " . implode(', ', $arguments);
}
}

$obj = new Fruit();
$obj->banana('yellow', 'sweet');

Result:
Calling method 'banana' with arguments: yellow, sweet

در مثال بالا از کلاس Fruit متدی به نام banana صدا زده شده که وجود ندارد، در نتیجه مجیک متد __call صدا زده می شود و عملیاتی را انجام می دهد.
در این مثال تنها نام متد و آرگومان های آن چاپ شده ولی در استفاده های جدی تر میتوان بسته به نام صدا زده شده متدی دیگر را فراخوانی کرد.
مثال:

class ّFruit {
public function __call($name, $arguments) {
if ($name === 'banana'){
banana($arguments);
}elsif ($name === 'apple'){
apple($arguments);
}
}
}
$obj = new Fruit();

$obj->banana('yellow', 'sweet');
Result:
Calling method 'banana' with arguments: yellow, sweet

$obj->apple('red', 'sweet');
Result:
Calling method 'apple' with arguments: red, sweet

در مثال بالا بسته به نام متد صدا زده که تعریف نشده است تابعی صدا زده می شود، به عنوان مثال اگر متد banana را صدا بزنیم تابعی به نام banana فراخوانی می شود، و استفاده های کاربردی تر....

متد __callStatic() : این متد مشابه __call() عمل می‌کند، با این تفاوت که برای تماس با متدهای استاتیک نامعتبر یا غیرموجود در یک کلاس استفاده می‌شود. وقتی یک متد استاتیک نامعتبر فراخوانی می‌شود، متد __callStatic() فراخوانی می‌شود و شما می‌توانید عملیات مربوط به این فراخوانی را در آن تعریف کنید.
متد __callStatic() دو پارامتر دریافت می‌کند: نام متد فراخوانی شده و آرگومان‌های متد. شما می‌توانید با استفاده از این دو پارامتر عملیات دلخواه خود را انجام دهید.
مثال:
class Fruit {
public static function __callStatic($name, $arguments) {
echo "Calling static method '$name' with arguments: " . implode(', ', $arguments);
}
}

Fruit::banana('yellow', 'sweet');

Result:
Calling static method 'banana' with arguments: yellow, sweet

بقیه موارد مانند متد __call می باشند.
.
3
#magic_method #oop #php
چهار مجیک متد بعدی
__get(), __set(), __isset(), __unset() 
هستند و در ادامه آنها را با ذکر مثال بررسی می کنیم.
این متد ها برای مدیریت دسترسی به ویژگی‌ها در کلاس‌ها استفاده می‌شوند و به شما این امکان را می‌دهند تا در زمان اجرا عملیات خاصی را بر روی پروپرتی‌های موجود در یک شئ انجام دهید.

مجیک متد __get() : این متد وقتی فراخوانی می‌شود که شما به یک پروپرتی غیرمعتبر یا غیرقابل دسترس در کلاس دسترسی پیدا کنید. با استفاده از این متد، شما می‌توانید عملیاتی را تعریف کنید تا مقدار پروپرتی مورد نظر را برگرداند یا عملیات دلخواه خود را انجام دهید.مثال:
class MyClass {
public function __get($name) {
return $name;
}
}

$obj = new MyClass();
$obj->name = 'Reza';
echo $obj->name;

Result:
Reza

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

مجیک متد __set() : این متد وقتی فراخوانی می‌شود که شما به یک پروپرتی غیرمعتبر یا غیرقابل دسترس در کلاس مقداردهی کنید. با استفاده از این متد، شما می‌توانید عملیاتی را تعریف کنید تا مقدار داده شده به پروپرتی را در کلاس ذخیره کند یا عملیات دلخواه خود را انجام دهید. مثال:
class MyClass {    
private $data = [];
public function __set($name, $value) {
$this->data[$name] = $value;
}
}

$obj = new MyClass();
$obj->name = 'Reza';
echo $obj->name;

Result:
Reza

در مثال بالا هنگام مقدار دهی name متد __set() صدا زده می شود و عملیات مقدار دهی را انجام می دهد.

در دو مثال بالا از متد های __get() و __set() صدا زده نشوند در برخی مواقع کد اجرا می شود ولی این راه غیر اصولی است و کد همراه با هشدار اجرا می شود.

مجیک متد __isset() : این متد وقتی فراخوانی می‌شود که شما از عملگر isset() برای چک کردن وجود یک پروپرتی در کلاس استفاده کنید. با استفاده از این متد، شما می‌توانید عملیاتی را تعریف کنید تا بررسی کند آیا پروپرتی در کلاس وجود دارد یا نه. مثال:
class MyClass {
private $data = [];
public function __isset($name) {
return isset($this->data[$name]);
}
}

$obj = new MyClass();
$obj->name = 'John';
var_dump(isset($obj->name));
var_dump(isset($obj->age));

Result:
bool(true)
bool(false)

در مثال بالا زمانی که isset() روی
$obj->name
و
$obj->age
اعمال می شود مجیک متد __isset() فراخوانی می شود و وجود پراپرتی را بررسی می کند.

مجیک متد __unset() : این متد وقتی فراخوانی می‌شود که شما از عملگر unset() برای حذف یک پروپرتی در کلاس استفاده کنید. با استفاده از این متد، شما می‌توانید عملیاتی را تعریف کنید تا پروپرتی مورد نظر را از کلاس حذف کند یا عملیات دلخواه خود را انجام دهید. مثال:
class MyClass {
private $data = [];
public function __unset($name) {
unset($this->data[$name]);
}
}

$obj = new MyClass();
$obj->name = 'John';
unset($obj->name);
var_dump(isset($obj->name));

Result:
bool(false)

در مثال بالا هنگام
unset()
کردن
$obj->name
متد __unset() اجرا می شود و عملیات حذف پراپرتی را انجام می دهد.

تمامی متد های بالا زمانی استفاده می شوند که بخواهیم عملی را روی پراپرتی تعریف نشده یا private و protected انجام دهیم.
.
👍2
#magic_method #oop #php
مجیک متد های __sleep() و __wakeup() :
این دو متد رای کنترل عملیات سریالیزه کردن (Serialization) و (Unserialization) یک شئ مورد استفاده قرار می‌گیرند. این متدها به شما امکان می‌دهند تا در زمان Serialization و Unserialization شئ، عملکرد و رفتار مربوطه را مشخص کنید.

متد __sleep() : این متد در هنگام سریالیزه کردن یک شئ فراخوانی می‌شود. ممکن است نیاز داشته باشید تا برخی از ویژگی‌ها یا حالت‌های شئ را قبل از سریالیزه شدن آن، ذخیره کنید. معمولا در این متد لیستی از نام‌های ویژگی‌هایی که قرار است سریالیزه شوند را برمی‌گردانید. برای مثال، می‌توانید برخی از ویژگی‌هایی که نباید در هنگام سریالیزه کردن ذخیره شوند را حذف کنید. مثال:
class Fruit {
public $name;
public $color;
private $secret;

public function __construct($prop1, $prop2, $secret) {
$this->name = $prop1;
$this->color = $prop2;
$this->secret = $secret;
}

public function __sleep() {
return ['name', 'color'];
}
}

$obj = new Fruit('banana', 'yellow', 'sensitive data');
$data = serialize($obj);
echo $data;

Result:
O:5:"Fruit":2:{s:4:"name";s:6:"banana";s:5:"color";s:6:"yellow";}

در این مثال، با استفاده از __sleep()، فقط ویژگی‌های
name
و
color
سریالیزه می‌شوند و ویژگی secret در فرآیند سریالیزه کردن حذف می‌شود.

متد __wakeup() : این متد در هنگام Unserialization یک شئ فراخوانی می‌شود. ممکن است نیاز داشته باشید تا پس از Unserialization شئ و بازیابی ویژگی‌های آن، عملیاتی را انجام دهید. به عنوان مثال، می‌توانید برخی از پردازش‌های خاص را بعد از Unserialization شئ انجام دهید. مثال:
class Fruit {
public $name;
public $color;

public function __construct($prop1, $prop2) {
$this->name = $prop1;
$this->color = $prop2;
}

public function __wakeup() {
$this->color = strtoupper($this->color);
}
}

$data = 'O:5:"Fruit":2:{s:4:"name";s:6:"banana";s:5:"color";s:6:"yellow";}';
$obj = unserialize($data);
echo $obj->color;

Result:
YELLOW

در این مثال، با استفاده از __wakeup()، پس از Unserialization شئ، مقدار ویژگی
color
به صورت Uppercase تغییر می‌کند.

این دو مثال کوچکی برای درک این دو متد بود و مطمئنا عملیات های بزرگتری میتوان با آن ها انجام داد.
.
🔥21
#magic_method #oop #php
مجیک متد های __serialize() و __unserialize() :
این متد ها به شما این امکان را می‌دهند تا روند serialize و unserialize شدن یک شئ را کنترل کنید.

متد __serialize() : این متد برای تعریف فرمت داده‌ای serialize شده استفاده می‌شود. در هنگام استفاده از تابع serialize() فراخوانی می‌شود و باید یک آرایه از داده‌ها را برگرداند که به عنوان نمایش serialize شده استفاده می‌شود. شما می‌توانید هر نوع داده‌ای را در این آرایه شامل کنید، از جمله داده‌های عددی، استرینگ، آرایه، آبجکت و ...

متد __unserialize() : این متد برای بازسازی یک شئ از یک نمایش serialize شده استفاده می‌شود. این تابع در هنگام استفاده از تابع unserialize() فراخوانی می‌شود و باید داده‌های serialize شده را بازیابی کرده و یک شئ جدید را برگرداند.

مثال:
class Fruit {
public $name;
public $color;

public function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}

public function __serialize(): array {
return [
'name' => $this->name,
'color' => $this->color
];
}

public function __unserialize(array $data): void {
$this->name = $data['name'];
$this->color = $data['color'];
}
}

$fruit = new Fruit('banana', 'yellow');

$serialized = serialize($fruit);
echo $serialized . "\n";

// Result:
// O:5:"Fruit":2:{s:4:"name";s:6:"banana";s:5:"color";s:6:"yellow";}

$unserialized = unserialize($serialized);
echo $unserialized->name . "\n";
echo $unserialized->color . "\n";

// Result:
// banana
// yellow

در
مثال بالا در متد
__serialize()
مقادیری که باید serialize شوند بازگردانده می شود و در متد
__unserialize
داده های serialize شده دریافت می شود و پس از unserialize مقادیر آن در ویژگی های name و color وارد می شود.

فهمیدیم که این دو تابع هم مانند __sleep() و __wakeup() مربوط به عملیات Serialization هستند اما تفاوت های آنها در چیست؟
متد __serialize() هنگام serialize شدن یک شئ، اجرا می شود.
متد __unserialize() هنگام unserialize شدن یک شئ اجرا می شود.
متد __sleep() قبل از serialize شدن یک شئ، اجرا می شود.
متد __wakeup() بعد از unserialize شدن یک شئ اجرا می شود.
.
#magic_method #oop #php
مجیک متد __toString() :
با استفاده از متد __toString()، می‌توانید برای یک شئT یک نمایش قابل فهم تعریف کنید. بطور کلی، این متد برای تبدیل یک شئ به یک رشته برای استفاده در محیط‌هایی مانند تابع echo مورد استفاده قرار می‌گیرد.
مثال:
class Fruit {
private $name;

public function __construct($name) {
$this->name = $name;
}

public function __toString() {
return "This is a " . $this->name;
}
}

$fruit = new Fruit("banana");
echo $fruit;

// Result:
// This is a banana

در مثال بالا ما به طور مستقیم یک شئ را echo کرده ایم، این کار به طور پیش فرض امکان پذیر نیست که یک شئ echo شود، اما توسط متد __toString()، شئ را به یک نمایش استریگی تبدیل کرده اییم.
.
مجیک متد __invoke() :
با استفاده از این تابع، شئ را می‌توان مانند یک تابع فراخوانی کرد. به عبارت دیگر، وقتی شئ به صورت مستقیم فراخوانی می‌شود، تابع __invoke() آن شئ فراخوانی می‌شود.
مثال :
class Fruit {
public function __invoke($arg) {
echo "this is a $arg!";
}
}

$fruit = new Fruit();
$fruit('banana');

در مثال بالا یک شئ از کلاس Fruit ساخته شده و در متغییر $fruit قرار داده شده است، سپس متغییر $fruit که نمونه ساخته شده از کلاس Fruit هست به عنوان یک تابع صدا زده شده در این صورت متد __invoke() فراخوانی می شود.
.
👍2
#magic_method #oop #php
مجیک متد __set_state() :
این متد برای ایجاد یک شئ از یک آرایه بازگردانده شده توسط تابع var_export() استفاده می‌شود. وقتی var_export() را روی یک شئ فراخوانی می‌کنید، اگر تابع __set_state() در کلاس مربوطه تعریف شده باشد، آن تابع برای بازسازی شئ از آرایه استفاده می‌شود.
این متد یک ورودی آرایه برای بازسازی دریافت می کند.
نکته : این متد به صورت استاتیک نوشته می شود.
مثال :
class Fruit {
public $name;
public $color;

public static function __set_state($array) {
$obj = new self();
$obj->name = $array['name'];
$obj->color = $array['color'];
return $obj;
}
}

$fruit = new Fruit();
$fruit->name = 'banana';
$fruit->color = 'yellow';
var_export($fruit);

$array = array(
'name' => 'banana',
'color' => 'yellow'
);
$reconstructedFruit = eval('return ' . var_export($array, true) . ';');

var_dump($reconstructedFruit);

در این مثال، کلاس Fruit دارای دو ویژگی (name و color) است. تابع __set_state() در این کلاس تعریف شده است و آرایه ورودی را به عنوان آرگومان دریافت می‌کند. با استفاده از مقادیر آرایه، یک شئ جدید از کلاس ایجاد می‌شود و مقادیر ویژگی‌ها را از آرایه تنظیم می‌کند. سپس شئ جدید را برمی‌گرداند.

در این مثال، ابتدا یک شئ از کلاس ایجاد شده و با استفاده از تابع var_export() نمایش داده می‌شود. سپس با استفاده از تابع var_export() بر روی یک آرایه، یک شئ جدید بازسازی می‌شود و نمایش داده می‌شود.

متد __set_state() زمانی استفاده می شود که شما می‌خواهید یک شئ را به صورت سریع بازسازی کنید و از یک آرایه استفاده کنید که توسط var_export() تولید شده است.
.
#magic_method #oop #php
مجیک متد __clone() :
این متد برای ایجاد نسخه ای کپی از یک شئ استفاده می‌شود. وقتی از عملگر کلون (clone) استفاده می‌کنید، تابع __clone() در کلاس مربوطه اجرا می‌شود و می‌توانید تنظیمات مورد نیاز برای نسخه کپی را انجام دهید.
مثال :
class Fruit {
public $name;
public $color;

public function __clone() {
$this->name = 'cloned fruit name';
$this->color = 'cloned fruit color';
}
}

$firstFruit = new Fruit();
$firstFruit->name = 'banana';
$firstFruit->color = 'red';

$clonedFruit = clone $firstFruit;

var_dump($firstFruit);

var_dump($clonedFruit);

Result:

object(Fruit)#1 (2) {
["name"]=>
string(6) "banana"
["color"]=>
string(3) "red"
}
object(Fruit)#2 (2) {
["name"]=>
string(17) "cloned fruit name"
["color"]=>
string(18) "cloned fruit color"
}

در مثال بالا یک شئ از Fruit با دو ویژگی name و color ساخته ایم و سپس یک clone از آن گرفته ایم، زمان استفاده از عملگر clone متد __clone() فراخوانی می شود و شئ جدید را با ویژگی های تنظیم شده می سازد.
.
👍1
#magic_method #oop #php
مجیک متد __debugInfo() :
این متد برای تعریف اطلاعاتی است که برای نمایش در روند debugging یا در تابع var_dump() از یک شئ استفاده می‌شود. با تعریف تابع __debugInfo() در کلاس خود، شما می‌توانید اطلاعات مخصوصی را برای نمایش در این فرایندها تعیین کنید.
این متد باید یک آرایه اطلاعات را برگرداند که شامل جفت‌های key-value است. این جفت‌ها باید مشخص کننده ویژگی‌ها و مقادیر آنها در شئ باشند که می‌خواهید در روند debugging نمایش داده شوند.

مثال:
class Fruit {
public $name;
public $color;

public function __debugInfo() {
return [
'fruit name' => $this->name,
'fruit color' => $this->color
];
}
}

$fruit = new Fruit();
$fruit->name = 'banana';
$fruit->color = 'yellow';

var_dump($fruit);

Result:
object(Fruit)#1 (2) {
["fruit name"]=>
string(6) "banana"
["fruit color"]=>
string(6) "yellow"
}

در این مثال می بینیم که هنگام var_dump() شئ، موارد مشخص شده در __debugInfo() به نمایش در می آید.با این کار می توانیم تنها موارد مورد نیاز را نمایش دهیم و روند debugging را راحت تر کنیم.
.
چند وقتی هست که روی یک پروژه کار میکنم
یه کتابخونه برای ربات های تلگرامی

قابلیت ها:
- پشتیبانی از الوکوئنت لاراول
- - مدل
- - مایگریشن

- پشتیبانی از openSwoole و AMPHP
- - کوروتین
- - و Swoole Table

- پشتیبانی از Telegram Bot Api Server

- پشتیبانی از دیتابیس های:
MySql, Redis, Json

- پشتیبانی از Command Line
- - ساخت مدل و مایگریشن دیتابیس
- - ساخت ریسورس های ربات
- - ران کردن وب سرور
- - مدیریت وب هوک
- سیستم Auth & Access اختصاصی

سرعت ربات درحالت سینک 100ms
سرعت ربات در حالت اِی سینک 1ms

البته هنوز اول راهش هست و قراره کلی قابلیت بهش اضافه بشه که چند تاش پشتیبانی از PHP-ML (کتابخانه هوش مصنوعی) و ساخت ربات های CLI هست

اولش برای استفاده شخصی ساخته بودم ولی خب گفتم بزارم گیت هاب که بقیه هم استفاده کنن

از این لینک میتونید مشاهده ش کنی و خوش حال میشم Star هم بکنید❤️
🔥5👍1