#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
دو مجیک متد مهم دیگر در
این متدها به شما اجازه میدهند تا به طور پویا و در زمان اجرا، تماس با متدهای نامعتبر یا غیرموجود یک کلاس را کنترل کنید.
متد
متد
مثال :
Calling method 'banana' with arguments: yellow, sweet
در مثال بالا از کلاس
در این مثال تنها نام متد و آرگومان های آن چاپ شده ولی در استفاده های جدی تر میتوان بسته به نام صدا زده شده متدی دیگر را فراخوانی کرد.
مثال:
Calling method 'banana' with arguments: yellow, sweet
Calling method 'apple' with arguments: red, sweet
در مثال بالا بسته به نام متد صدا زده که تعریف نشده است تابعی صدا زده می شود، به عنوان مثال اگر متد
متد
متد
مثال:
Calling static method 'banana' with arguments: yellow, sweet
بقیه موارد مانند متد
.
دو مجیک متد مهم دیگر در
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
چهار مجیک متد بعدی
این متد ها برای مدیریت دسترسی به ویژگیها در کلاسها استفاده میشوند و به شما این امکان را میدهند تا در زمان اجرا عملیات خاصی را بر روی پروپرتیهای موجود در یک شئ انجام دهید.
مجیک متد
Reza
در مثال بالا پراپرتی
مجیک متد
Reza
در مثال بالا هنگام مقدار دهی
در دو مثال بالا از متد های
مجیک متد
bool(true)
bool(false)
در مثال بالا زمانی که
مجیک متد
bool(false)
در مثال بالا هنگام
تمامی متد های بالا زمانی استفاده می شوند که بخواهیم عملی را روی پراپرتی تعریف نشده یا
.
چهار مجیک متد بعدی
__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
| AmirHossein |
#magic_method #oop #php چهار مجیک متد بعدی __get(), __set(), __isset(), __unset() هستند و در ادامه آنها را با ذکر مثال بررسی می کنیم. این متد ها برای مدیریت دسترسی به ویژگیها در کلاسها استفاده میشوند و به شما این امکان را میدهند تا در زمان اجرا عملیات…
حقیقتا توضیح این چهار مجیک متد سخت بود و من هم انشا(منظورم مهارت گفتاری و نوشتاریه😂) خوبی ندارم که درست توضیح بدم.
اگر جایی مبهم یا اشتباه هست بگید🙏
.
اگر جایی مبهم یا اشتباه هست بگید🙏
.
❤1
#magic_method #oop #php
مجیک متد های
این دو متد رای کنترل عملیات سریالیزه کردن (
متد
O:5:"Fruit":2:{s:4:"name";s:6:"banana";s:5:"color";s:6:"yellow";}
در این مثال، با استفاده از
متد
YELLOW
در این مثال، با استفاده از
این دو مثال کوچکی برای درک این دو متد بود و مطمئنا عملیات های بزرگتری میتوان با آن ها انجام داد.
.
مجیک متد های
__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 تغییر میکند.این دو مثال کوچکی برای درک این دو متد بود و مطمئنا عملیات های بزرگتری میتوان با آن ها انجام داد.
.
🔥2❤1
#magic_method #oop #php
مجیک متد های
این متد ها به شما این امکان را میدهند تا روند
متد
متد
مثال:
// O:5:"Fruit":2:{s:4:"name";s:6:"banana";s:5:"color";s:6:"yellow";}
// banana
// yellow
در مثال بالا در متد
فهمیدیم که این دو تابع هم مانند
متد
متد
متد
متد
.
مجیک متد های
__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);// Result:
echo $unserialized->name . "\n";
echo $unserialized->color . "\n";
// banana
// yellow
در مثال بالا در متد
__serialize()مقادیری که باید
serialize شوند بازگردانده می شود و در متد __unserializeداده های
serialize شده دریافت می شود و پس از unserialize مقادیر آن در ویژگی های name و color وارد می شود.فهمیدیم که این دو تابع هم مانند
__sleep() و __wakeup() مربوط به عملیات Serialization هستند اما تفاوت های آنها در چیست؟متد
__serialize() هنگام serialize شدن یک شئ، اجرا می شود.متد
__unserialize() هنگام unserialize شدن یک شئ اجرا می شود.متد
__sleep() قبل از serialize شدن یک شئ، اجرا می شود.متد
__wakeup() بعد از unserialize شدن یک شئ اجرا می شود..
#magic_method #oop #php
مجیک متد
با استفاده از متد
مثال:
// This is a banana
در مثال بالا ما به طور مستقیم یک شئ را
.
مجیک متد
__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
مجیک متد
این متد برای ایجاد نسخه ای کپی از یک شئ استفاده میشود. وقتی از عملگر کلون (
مثال :
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"
}
در مثال بالا یک شئ از
.
مجیک متد
__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
مجیک متد
این متد برای تعریف اطلاعاتی است که برای نمایش در روند
این متد باید یک آرایه اطلاعات را برگرداند که شامل جفتهای
مثال:
object(Fruit)#1 (2) {
["fruit name"]=>
string(6) "banana"
["fruit color"]=>
string(6) "yellow"
}
در این مثال می بینیم که هنگام
.
مجیک متد
__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 هم بکنید❤️
یه کتابخونه برای ربات های تلگرامی
قابلیت ها:
- پشتیبانی از الوکوئنت لاراول
- - مدل
- - مایگریشن
- پشتیبانی از openSwoole و AMPHP
- - کوروتین
- - و Swoole Table
- پشتیبانی از Telegram Bot Api Server
- پشتیبانی از دیتابیس های:
MySql, Redis, Json
- پشتیبانی از Command Line
- - ساخت مدل و مایگریشن دیتابیس
- - ساخت ریسورس های ربات
- - ران کردن وب سرور
- - مدیریت وب هوک
- سیستم Auth & Access اختصاصی
سرعت ربات درحالت سینک 100ms
سرعت ربات در حالت اِی سینک 1ms
البته هنوز اول راهش هست و قراره کلی قابلیت بهش اضافه بشه که چند تاش پشتیبانی از PHP-ML (کتابخانه هوش مصنوعی) و ساخت ربات های CLI هست
اولش برای استفاده شخصی ساخته بودم ولی خب گفتم بزارم گیت هاب که بقیه هم استفاده کنن
از این لینک میتونید مشاهده ش کنی و خوش حال میشم Star هم بکنید❤️
GitHub
GitHub - laraXgram/LaraGram: LaraGram, an advanced framework for Telegram Bot development
LaraGram, an advanced framework for Telegram Bot development - laraXgram/LaraGram
🔥5👍1
می رسیم به مبحث
این ثابت ها در هنگام کامپایل تعریف می شوند بر خلاف ثابت های معمولی که در زمان اجرا تعریف می شوند و به حروف کوچک و بزرگ حساس نیستند.
لیست این ثابت ها با تعریف به شرح زیر است:
شماره خط فعلی فایل
نام فایل فعلی
نام فولدر فعلی (در انتها نام فولدر اسلش وجود ندارد مگر در فولدر روت)
نام فانکشن فعلی (مقدار {closure} برای تابع های ناشناس)
نام کلاس فعلی (همراه با namespace)
نام تریت فعلی (همراه با namespace)
نام متد فعلی کلاس
نام
کلاس با تمامی داده ها
.
Magic constants ها در php
طبق مستندات php، نه مجیک کانستنت وجود داره که بسته به محل استفاده و شرایط موجود مقادیر آنها تغییر پیدا میکنه.این ثابت ها در هنگام کامپایل تعریف می شوند بر خلاف ثابت های معمولی که در زمان اجرا تعریف می شوند و به حروف کوچک و بزرگ حساس نیستند.
لیست این ثابت ها با تعریف به شرح زیر است:
__LINE__ : شماره خط فعلی فایل
__FILE__ :نام فایل فعلی
__DIR__ :نام فولدر فعلی (در انتها نام فولدر اسلش وجود ندارد مگر در فولدر روت)
__FUNCTION__ :نام فانکشن فعلی (مقدار {closure} برای تابع های ناشناس)
__CLASS__ :نام کلاس فعلی (همراه با namespace)
__TRAIT__ :نام تریت فعلی (همراه با namespace)
__METHOD__ :نام متد فعلی کلاس
__NAMESPACE__ :نام
namespace فعلیClassName::class :کلاس با تمامی داده ها
.
| AmirHossein |
چند وقتی هست که روی یک پروژه کار میکنم یه کتابخونه برای ربات های تلگرامی قابلیت ها: - پشتیبانی از الوکوئنت لاراول - - مدل - - مایگریشن - پشتیبانی از openSwoole و AMPHP - - کوروتین - - و Swoole Table - پشتیبانی از Telegram Bot Api Server - پشتیبانی از…
کتابخانه LaraGram از طریق Composer در دسترس است!
.
composer create-project laraxgram/laragram:dev-master@dev my-bot
گیت هاب.
👍1
دو مبحث هست که دوست دارم راجع بهش توضیح بدم
یک : معرفی ۱۰ تا دیزاین پترن و آموزششون
دو : روش های نفوذپذیری وب و جلوگیری ازش
فقط نمیدونم کدوم رو اول بگم
هر دو مبحث طولانی و زمان بر هست
همین یکی دو روز آینده یکیش رو شروع میکنم
نظری داشتید خوشحال میشم در میون بزارید❤️
یک : معرفی ۱۰ تا دیزاین پترن و آموزششون
دو : روش های نفوذپذیری وب و جلوگیری ازش
فقط نمیدونم کدوم رو اول بگم
هر دو مبحث طولانی و زمان بر هست
همین یکی دو روز آینده یکیش رو شروع میکنم
نظری داشتید خوشحال میشم در میون بزارید❤️
❤2👍1
متسفانه به دلیل مسائل امنیتی که توی کامیت های LaraGram به وجود اومده بود مجبور به حذف ریپوزیتوری شدم
و خب 72 کامیت که داشت به علاوه استار ها حذف شدند
برای اینکه از این نوع مسائل براتون پیش نیاد میتونه خوب باشه که قابلیت Secret scanning رو فعال کنید
این قابلیت قبل از Push کردن کد رو بررسی میکنه و اگر حاوی توکن و امثالش باشه بهتون هشدار میده
برای فعال کردنش
Setting >> Code security and analysis :
Secret scanning : Enable
Push protection : Enable
در نهایت هم اگر دوست داشتید و براتون مقدور بود مجدد به ریپوزیتوری استار بدید❤️🙏
https://github.com/laraXgram/LaraGram
.
و خب 72 کامیت که داشت به علاوه استار ها حذف شدند
برای اینکه از این نوع مسائل براتون پیش نیاد میتونه خوب باشه که قابلیت Secret scanning رو فعال کنید
این قابلیت قبل از Push کردن کد رو بررسی میکنه و اگر حاوی توکن و امثالش باشه بهتون هشدار میده
برای فعال کردنش
Setting >> Code security and analysis :
Secret scanning : Enable
Push protection : Enable
در نهایت هم اگر دوست داشتید و براتون مقدور بود مجدد به ریپوزیتوری استار بدید❤️🙏
https://github.com/laraXgram/LaraGram
.
👍3❤1
#design_patterns
خب، قرار شد که 10 تا از دیزاین پترن های پرکاربرد رو معرفی و توضیح بدیم
اما قبل از اینکه شروع کنیم اول باید بدونیم دیزاین پترن چیه
دیزاین پترن (
مجموعهای از قواعد و الگوهایی است که در فرآیند طراحی نرمافزارها مورد استفاده قرار میگیرند. این الگوها برای حل مشکلات معمول در طراحی نرمافزارها، بهبود قابلیتها و کاهش پیچیدگی استفاده میشوند.
چند تا از کاربرد های اصلی دیزاین پترن ها :
1- افزایش قابلیت خوانایی و درک کد: از اونجایی که دیزاین پترن ها یک ساختار مشخص و قابل فهم دارند، قابلیت خوانایی کد رو هم برای برنامه نویس پروژه و هم سایر برنامه نویسان افزایش میدن.
2- کاهش پیچیدگی: دیزاین پترن با ارائه یک روش ساختارمند برای حل مشکلات معمول، پیچیدگی طراحی را کاهش میدهند و فرآیند توسعه نرمافزار را سادهتر میکنند.
3- افزایش قابلیت استفاده دوباره: دیزاین پترن با ارائه الگوهای استاندارد برای حل مسائل مشترک، امکان استفاده مجدد کد را افزایش میدهند و زمان و هزینههای توسعه را کاهش میدهند.
4- افزایش انعطافپذیری: دیزاین پترن با ایجاد ساختارهای قابل تغییر و گسترش، انعطافپذیری نرمافزار را افزایش میدهند و امکان تغییرات و بهبودهای آتی را فراهم میکنند.
5- استانداردسازی و هماهنگسازی: این الگوها به توسعهدهندگان کمک میکنند تا مشکلات معمول در طراحی نرمافزارها را حل کنند و به ساختار و عملکرد بهینه نرمافزارها دست پیدا کنند.
تا اینجا با برخی خواص دیزاین پترن ها آشنا شدیم
لیستی از دیزاین پترن هایی که قصد دارم در ادامه توضیح بده :
این الگو ها معمولا در بقیه زبان ها هم کاربرد دارند اما مثال ها با
.
خب، قرار شد که 10 تا از دیزاین پترن های پرکاربرد رو معرفی و توضیح بدیم
اما قبل از اینکه شروع کنیم اول باید بدونیم دیزاین پترن چیه
دیزاین پترن (
Design Patterns) :مجموعهای از قواعد و الگوهایی است که در فرآیند طراحی نرمافزارها مورد استفاده قرار میگیرند. این الگوها برای حل مشکلات معمول در طراحی نرمافزارها، بهبود قابلیتها و کاهش پیچیدگی استفاده میشوند.
چند تا از کاربرد های اصلی دیزاین پترن ها :
1- افزایش قابلیت خوانایی و درک کد: از اونجایی که دیزاین پترن ها یک ساختار مشخص و قابل فهم دارند، قابلیت خوانایی کد رو هم برای برنامه نویس پروژه و هم سایر برنامه نویسان افزایش میدن.
2- کاهش پیچیدگی: دیزاین پترن با ارائه یک روش ساختارمند برای حل مشکلات معمول، پیچیدگی طراحی را کاهش میدهند و فرآیند توسعه نرمافزار را سادهتر میکنند.
3- افزایش قابلیت استفاده دوباره: دیزاین پترن با ارائه الگوهای استاندارد برای حل مسائل مشترک، امکان استفاده مجدد کد را افزایش میدهند و زمان و هزینههای توسعه را کاهش میدهند.
4- افزایش انعطافپذیری: دیزاین پترن با ایجاد ساختارهای قابل تغییر و گسترش، انعطافپذیری نرمافزار را افزایش میدهند و امکان تغییرات و بهبودهای آتی را فراهم میکنند.
5- استانداردسازی و هماهنگسازی: این الگوها به توسعهدهندگان کمک میکنند تا مشکلات معمول در طراحی نرمافزارها را حل کنند و به ساختار و عملکرد بهینه نرمافزارها دست پیدا کنند.
تا اینجا با برخی خواص دیزاین پترن ها آشنا شدیم
لیستی از دیزاین پترن هایی که قصد دارم در ادامه توضیح بده :
Singleton Factory Observer MVC Repository Strategy Facade Dependency Injection
Template Method
Iterator این الگو ها معمولا در بقیه زبان ها هم کاربرد دارند اما مثال ها با
PHP خواهند بود..
🔥3
#design_patterns
یکی از معروف ترین و ساده ترین دیزان پترن ها
دیزان پترن
ساختارش به این صورت هست:
این کلاس دارای یک پراپرتی
زمانی که متد
در صورتی که نمونه ساخته نشده باشد(پراپرتی
با استفاده از این دیزاین پترن درصورتی که صد ها بار هم از کلاس
database connected
.
یکی از معروف ترین و ساده ترین دیزان پترن ها
Singleton هست.دیزان پترن
Singleton برای ایجاد یک کلاسی استفاده میشود که تنها یک نمونه از آن در سراسر برنامه وجود دارد. این الگو برای اطمینان از اینکه تمام اجزای برنامه از یک نمونه واحد استفاده میکنند، مفید است.ساختارش به این صورت هست:
class DatabaseConnection {
private static $instance;
private function __construct() {
echo "database connected";
}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new DatabaseConnection();
}
return self::$instance;
}
}
در مثال بالا یک کلاس برای اتصال به دیتابیس داریم.این کلاس دارای یک پراپرتی
instance هست که یا null است یا حاوی یک نمونه از کلاس، و یک متد getInstance.زمانی که متد
getInstance فراخوانی شود چک می کند که آیا از قبل نمونه ایی از کلاس ساخته شده یا خیر، این کار را با بررسی مقدار پراپرتی instance انجام می دهد که آیا null هست یا حاوی یک نمونه از کلاس.در صورتی که نمونه ساخته نشده باشد(پراپرتی
instance برابر null باشد) یک نمونه جدید می سازد و در صورتی که از قبل نمونه وجود داشته باشد(پراپرتی instance برابر نمونه ایی از کلاس باشد) همان نمونه قبلی را استفاده می کند.با استفاده از این دیزاین پترن درصورتی که صد ها بار هم از کلاس
DatabaseConnection نمونه بسازید فقط و فقط یک بار ساخته می شود.DatabaseConnection::getInstance();Result:
DatabaseConnection::getInstance();
DatabaseConnection::getInstance();
DatabaseConnection::getInstance();
database connected
.
❤3👍1
#design_patterns
مورد بعدی دیزاین پترن
این دیزاین پترن در
مثال:
در نهایت، کلاس
برای استفاده از الگوی
yellow
red
با استفاده از الگوی
.
مورد بعدی دیزاین پترن
Factory هست.این دیزاین پترن در
PHP برای ایجاد شئ ها به صورت پویا و بر اساس نیازها و شرایط مختلف استفاده میشود. این الگو به شما اجازه میدهد که بدون نیاز به دستکاری کد اصلی، شئ های مختلف را ایجاد کنید.مثال:
interface Fruit {
public function color();
}
class Banana implements Fruit {
public function color() {
echo "yellow";
}
}
class Apple implements Fruit {
public function color() {
echo "red";
}
}
class FruitFactory {
public function createFruit($fruitName) {
if ($fruitName === 'banana') {
return new Banana();
} elseif ($fruitName === 'apple') {
return new Apple();
}
}
}
در مثال بالا، ابتدا یک اینترفیس Fruit تعریف شده است که توابعی مانند color را برای میوه ها تعریف میکند. سپس دو کلاس Banana و Apple ایجاد شدهاند که از رابط Fruit ارثبری میکنند و توابع color را پیادهسازی میکنند.در نهایت، کلاس
FruitFactory تعریف شده است که به عنوان یک فکتوری برای ایجاد شیءهای میوه عمل میکند. متد createFruit در این کلاس یک نوع میوه را به عنوان ورودی دریافت میکند و بر اساس نوع میوه مورد نظر، یک شئ مربوطه را ایجاد و برمیگرداند.برای استفاده از الگوی
Factory به روش زیر عمل می کنیم:$factory = new FruitFactory();Result:
$banana = $factory->createFruit('banana');
$banana->color();
yellow
$apple = $factory->createFruit('apple');
$apple->color();
Result:red
با استفاده از الگوی
Factory، ما میتوانیم به راحتی شئ های مختلف را ایجاد کنیم، بدون اینکه بخشهای دیگر برنامه را تغییر دهیم. این الگو به ما امکان میدهد به سادگی از تغییرات در ایجاد شئ ها برای موارد خاص استفاده کنیم..
👍2
#design_patterns
دیزاین پترن بعدی
دیزاین پترن
در دیزاین پترن
مثال:
همچنین، یک کلاس مشترککننده
Received data: Hello Banana!
Received data: Hello Banana!
در مثال بالا، ابتدا یک شئ
دیزاین پترن
.
دیزاین پترن بعدی
Observer که به معنی مشاهده گر هست.دیزاین پترن
Observer برای برقراری ارتباط بین اجزای نرمافزار به منظور رصد و پاسخ به تغییرات استفاده میشود. در این الگو، یک شئ ارائه دهنده اطلاعات مرتبط (مشترک) به تعدادی از شئ های مشاهدهکننده وابسته است. وقتی که وضعیت شئ ارائه دهنده اطلاعات تغییر میکند، تمام شئ های مشاهدهکننده مطلع میشوند و عملیاتی را براساس تغییرات انجام میدهند.در دیزاین پترن
Observer، ارتباط بین ارائه دهنده اطلاعات (موضوع) و شئ های مشاهدهکننده (مشترکین) به وسیله رابط یا کلاسی که شئ های مشاهدهکننده را نگهداری میکند (مشترککننده) برقرار میشود.مثال:
interface Observer {
public function update($data);
}
class Subject {
private $observers = [];
public function attach(Observer $observer) {
$this->observers[] = $observer;
}
public function detach(Observer $observer) {
$index = array_search($observer, $this->observers);
if ($index !== false) {
unset($this->observers[$index]);
}
}
public function notify($data) {
foreach ($this->observers as $observer) {
$observer->update($data);
}
}
}
class ConcreteObserver implements Observer {
public function update($data) {
echo "Received data: " . $data . "\n";
}
}
در مثال بالا، اینترفیس Observer تعریف شده است که تابع update را میشود پیادهسازی کرد. سپس کلاس Subject ایجاد شده است که شئ های Observer را نگهداری میکند. متد attach برای اضافه کردن شئ های Observer، متد detach برای حذف آنها و متد notify برای اطلاعرسانی تغییرات به تمام Observer ها استفاده میشود.همچنین، یک کلاس مشترککننده
ConcreteObserver تعریف شده است که روش update را پیادهسازی میکند. وقتی که تغییری در Subject رخ میدهد و تابع notify فراخوانی میشود، تمام مشترککنندهها (شئ های Observer) به طور خودکار تابع update را اجرا کرده و تغییرات را دریافت میکنند.$subject = new Subject();Result:
$observer1 = new ConcreteObserver();
$subject->attach($observer1);
$observer2 = new ConcreteObserver();
$subject->attach($observer2);
$subject->notify("Hello Banana!");
Received data: Hello Banana!
Received data: Hello Banana!
در مثال بالا، ابتدا یک شئ
Subject ایجاد شده و دو شئ ConcreteObserver به آن الحاق شدهاند. سپس با فراخوانی تابع notify روی Subject و ارسال پیام Hello Banana!، تمام مشترککنندهها این پیام را دریافت و نمایش میدهند.دیزاین پترن
Observer زمانی مفید است که یک تغییر در یک شئ منجر به تغییراتی در شئ های دیگر میشود و ارتباط ضعیف بین اجزا مد نظر است. این الگو باعث جداسازی اجزا و افزایش انعطافپذیری در نرمافزار میشود..
👍2