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

🫂 @StartUnity
Download Telegram
#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
می رسیم به مبحث Magic constants ها در php
طبق مستندات php، نه مجیک کانستنت وجود داره که بسته به محل استفاده و شرایط موجود مقادیر آنها تغییر پیدا میکنه.
این ثابت ها در هنگام کامپایل تعریف می شوند بر خلاف ثابت های معمولی که در زمان اجرا تعریف می شوند و به حروف کوچک و بزرگ حساس نیستند.
لیست این ثابت ها با تعریف به شرح زیر است:
__LINE__ :
شماره خط فعلی فایل

__FILE__ :
نام فایل فعلی

__DIR__ :
نام فولدر فعلی (در انتها نام فولدر اسلش وجود ندارد مگر در فولدر روت)

__FUNCTION__ :
نام فانکشن فعلی (مقدار {closure} برای تابع های ناشناس)

__CLASS__ :
نام کلاس فعلی (همراه با namespace)

__TRAIT__ :
نام تریت فعلی (همراه با namespace)

__METHOD__ :
نام متد فعلی کلاس

__NAMESPACE__ :
نام namespace فعلی

ClassName::class :
کلاس با تمامی داده ها

.
دو مبحث هست که دوست دارم راجع بهش توضیح بدم

یک : معرفی ۱۰ تا دیزاین پترن و آموزششون
دو : روش های نفوذپذیری وب و جلوگیری ازش

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

نظری داشتید خوشحال میشم در میون بزارید❤️
2👍1
متسفانه به دلیل مسائل امنیتی که توی کامیت های LaraGram به وجود اومده بود مجبور به حذف ریپوزیتوری شدم
و خب 72 کامیت که داشت به علاوه استار ها حذف شدند

برای اینکه از این نوع مسائل براتون پیش نیاد میتونه خوب باشه که قابلیت Secret scanning رو فعال کنید
این قابلیت قبل از Push کردن کد رو بررسی میکنه و اگر حاوی توکن و امثالش باشه بهتون هشدار میده

برای فعال کردنش
Setting >> Code security and analysis :
Secret scanning : Enable
Push protection : Enable

در نهایت هم اگر دوست داشتید و براتون مقدور بود مجدد به ریپوزیتوری استار بدید❤️🙏
https://github.com/laraXgram/LaraGram
.
👍31
#design_patterns
خب، قرار شد که 10 تا از دیزاین پترن های پرکاربرد رو معرفی و توضیح بدیم
اما قبل از اینکه شروع کنیم اول باید بدونیم دیزاین پترن چیه

دیزاین پترن (Design Patterns) :
مجموعه‌ای از قواعد و الگوهایی است که در فرآیند طراحی نرم‌افزارها مورد استفاده قرار می‌گیرند. این الگوها برای حل مشکلات معمول در طراحی نرم‌افزارها، بهبود قابلیت‌ها و کاهش پیچیدگی استفاده می‌شوند.

چند تا از کاربرد های اصلی دیزاین پترن ها :
1- افزایش قابلیت خوانایی و درک کد: از اونجایی که دیزاین پترن ها یک ساختار مشخص و قابل فهم دارند، قابلیت خوانایی کد رو هم برای برنامه نویس پروژه و هم سایر برنامه نویسان افزایش میدن.

2- کاهش پیچیدگی: دیزاین پترن با ارائه یک روش ساختارمند برای حل مشکلات معمول، پیچیدگی طراحی را کاهش می‌دهند و فرآیند توسعه نرم‌افزار را ساده‌تر می‌کنند.

3- افزایش قابلیت استفاده دوباره: دیزاین پترن با ارائه الگوهای استاندارد برای حل مسائل مشترک، امکان استفاده مجدد کد را افزایش می‌دهند و زمان و هزینه‌های توسعه را کاهش می‌دهند.

4- افزایش انعطاف‌پذیری: دیزاین پترن با ایجاد ساختارهای قابل تغییر و گسترش، انعطاف‌پذیری نرم‌افزار را افزایش می‌دهند و امکان تغییرات و بهبودهای آتی را فراهم می‌کنند.

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

تا اینجا با برخی خواص دیزاین پترن ها آشنا شدیم
لیستی از دیزاین پترن هایی که قصد دارم در ادامه توضیح بده :
Singleton
Factory
Observer
MVC
Repository
Strategy
Facade
Dependency Injection
Template Method
Iterator

این الگو ها معمولا در بقیه زبان ها هم کاربرد دارند اما مثال ها با PHP خواهند بود.
.
🔥3
#design_patterns
یکی از معروف ترین و ساده ترین دیزان پترن ها 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();
DatabaseConnection::getInstance();
DatabaseConnection::getInstance();
DatabaseConnection::getInstance();

Result:
database connected
.
3👍1
#design_patterns
مورد بعدی دیزاین پترن 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();

$banana = $factory->createFruit('banana');
$banana->color();

Result:
yellow

$apple = $factory->createFruit('apple');
$apple->color();

Result:
red

با استفاده از الگوی Factory، ما می‌توانیم به راحتی شئ های مختلف را ایجاد کنیم، بدون اینکه بخش‌های دیگر برنامه را تغییر دهیم. این الگو به ما امکان می‌دهد به سادگی از تغییرات در ایجاد شئ ها برای موارد خاص استفاده کنیم.
.
👍2
#design_patterns
دیزاین پترن بعدی 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();

$observer1 = new ConcreteObserver();
$subject->attach($observer1);

$observer2 = new ConcreteObserver();
$subject->attach($observer2);

$subject->notify("Hello Banana!");

Result:
Received data: Hello Banana!
Received data: Hello Banana!

در مثال بالا، ابتدا یک شئ Subject ایجاد شده و دو شئ ConcreteObserver به آن الحاق شده‌اند. سپس با فراخوانی تابع notify روی Subject و ارسال پیام Hello Banana!، تمام مشترک‌کننده‌ها این پیام را دریافت و نمایش می‌دهند.

دیزاین پترن Observer زمانی مفید است که یک تغییر در یک شئ منجر به تغییراتی در شئ های دیگر می‌شود و ارتباط ضعیف بین اجزا مد نظر است. این الگو باعث جداسازی اجزا و افزایش انعطاف‌پذیری در نرم‌افزار می‌شود.
.
👍2
#design_patterns
دیزاین پترن MVC یا معماری MVC که مخفف Model, View, Controller هست و تقریبا همتون باهاش آشنایی دارید.

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

مدل (Mpdel): مدل مسئولیتی را بر عهده دارد که داده‌ها و منطق برنامه را مدیریت کند. مدل‌ها معمولاً شامل کلاس‌ها و ساختارهای داده‌ای هستند که داده‌ها را نگهداری و عملیاتی روی آن‌ها را انجام می‌دهند. مثال‌هایی از مدل‌ها شامل کلاس‌های مرتبط با پایگاه داده، کلاس‌های مدیریت کننده داده و کلاس‌های مرتبط با قوانین برنامه هستند.

ویو یا نما (View): نما مسئولیت نمایش داده‌ها را دارد و بر اساس داده‌هایی که از مدل دریافت می‌کند، اطلاعات را به کاربر نمایش می‌دهد. نما معمولاً شامل تمپلیت‌ها، صفحات و بخش‌های واسط کاربری است که برای نمایش اطلاعات به کاربر استفاده می‌شود. نما مستقیماً با کاربر در ارتباط است و تغییرات در نما بر اثر ورودی کاربر اتفاق می‌افتد.

کنترلر یا کنترل کننده (Controller): کنترل‌کننده مسئولیت هدایت جریان کار بین مدل و نما را بر عهده دارد. وظیفه کنترل‌کننده این است که ورودی‌های کاربر را دریافت کرده، عملیات لازم را بر روی مدل انجام دهد و سپس نمایش مناسب را به نما بدهد. به عبارتی، کنترل‌کننده پلی بین مدل و نما است. مثال‌هایی از عملیاتی که کنترل‌کننده انجام می‌دهد، شامل بررسی validate کردن ورودی‌ها، انجام تغییرات در مدل و انتقال داده‌ها به نما است.

در معماری MVC، نمایش داده‌ها و همچنین منطق برنامه جدا از یکدیگر می‌شوند. این امکان را به توسعه‌دهندگان می‌دهد تا بخش‌های مختلف برنامه را به صورت مستقل توسعه دهند و تغییرات را در بخش‌های دیگر تأثیر ندهد. همچنین، جدا کردن منطق برنامه از نمایش داده‌ها باعث ساده‌سازی فرآیند تست و نگهداری می‌شود.

مثال :
class Model {
private $data;

public function setData($data) {
$this->data = $data;
}

public function getData() {
return $this->data;
}
}

class View {
public function render($data) {
echo "Data: " . $data;
}
}

class Controller {
private $model;
private $view;

public function __construct(Model $model, View $view) {
$this->model = $model;
$this->view = $view;
}

public function processData($data) {
$this->model->setData($data);
$data = $this->model->getData();
$this->view->render($data);
}
}

$model = new Model();
$view = new View();
$controller = new Controller($model, $view);
$controller->processData("Hello, World!");

Result:
Data: Hello, World!

در مثال بالا، مدل (Model) مسئولیتی برای نگهداری و مدیریت داده‌ها دارد. نما (View) وظیفه نمایش داده‌ها را دارد و کنترل‌کننده (Controller) وظیفه هدایت جریان کار بین مدل و نما را بر عهده دارد. با استفاده از کنترل‌کننده، داده ورودی (Hello, World!) به مدل داده شده، سپس از مدل خوانده شده و در نما نمایش داده می‌شود.

این معماری به توسعه‌دهندگان امکان می‌دهد که به صورت جداگانه بر روی هر بخش (مدل، نما و کنترل‌کننده) کار کنند و به سادگی تغییرات را اعمال کنند. همچنین، این الگوی طراحی باعث می‌شود برنامه ماژولارتر و قابل تست‌تر باشد.
.
بعد از کلی زمان گزاشتن روی پروژه LaraGram بلاخره در سایت تلگرام هم منتشر شد 🤝

کتابخانه ی بالایی (PTB) هم ساخت یکی از دوستان هست
فرصت داشتید STAR بدید به دو ریپوزیتوری زمان زیادی نمیبره❤️
.
5👌1