?? ??? ?? ????? ?
We comply with Telegram's guidelines:
- No financial advice or scams
- Ethical and legal content only
- Respectful community
Join us for market updates, airdrops, and crypto education!
Last updated 7 months, 2 weeks ago
[ We are not the first, we try to be the best ]
Last updated 10 months ago
FAST MTPROTO PROXIES FOR TELEGRAM
ads : @IR_proxi_sale
Last updated 6 months ago
دستور goto در PHP برای انتقال جریان اجرای برنامه به یک نقطه مشخص در کد استفاده میشود. این نقطه مشخص با یک برچسب (label) تعیین میشود. اگرچه استفاده از goto معمولاً توصیه نمیشود، زیرا میتواند کد را پیچیده و غیرقابل خواندن کند، اما در برخی موارد خاص میتواند مفید باشد.
دستور goto به این شکل نوشته میشود:
```
goto label;
label:
// Code to execute
```
مثال:فرض کنید یک حلقه for داریم که در آن یک شرط خاص را بررسی میکنیم. اگر این شرط برقرار باشد، میخواهیم بلافاصله به یک بخش دیگر از کد بپریم و ادامه حلقه را نادیده بگیریم. مثال زیر را در نظر بگیرید:
```
for ($i = 0; $i < 10; $i++) {
if ($i == 5) {
goto end;
}
echo "Current value of i: $i\n";
}
end:
echo "Loop terminated because i equals 5.";
```
در این مثال، حلقه از 0 تا 9 اجرا میشود، اما وقتی مقدار $i به 5 میرسد، دستور goto end اجرا میشود و برنامه به برچسب end منتقل میشود. نتیجه این است که حلقه متوقف میشود و پیغام "Loop terminated because i equals 5." نمایش داده میشود.
استفاده از goto میتواند باعث کاهش خوانایی کد شود. اگر کد پیچیده و طولانی باشد، دنبال کردن جریان اجرای برنامه میتواند دشوار شود.
در بیشتر موارد، میتوان از ساختارهای کنترلی دیگر مانند break، continue و return استفاده کرد که خواناتر و مناسبتر هستند.
مثال دیگر:فرض کنید نیاز داریم یک فایل را بخوانیم و اگر به یک خط خاص برسیم، به یک بخش دیگر از کد بپریم:
```
$file = fopen("example.txt", "r");
if ($file) {
while (($line = fgets($file)) !== false) {
if (strpos($line, 'special keyword') !== false) {
goto specialProcessing;
}
echo "Reading line: $line";
}
fclose($file);
}
specialProcessing:
echo "Special processing for a line containing 'special keyword'.";
```
در اینجا، فایل example.txt خط به خط خوانده میشود و اگر خطی شامل کلمه کلیدی 'special keyword' باشد، جریان برنامه به برچسب specialProcessing منتقل میشود.
دستور goto در PHP ابزار قدرتمندی است که میتواند در موارد خاص مفید باشد، اما باید با احتیاط و در شرایط مناسب استفاده شود. استفاده بیش از حد یا نابجا از goto میتواند کد را پیچیده و سختخوان کند، بنابراین همیشه به دنبال راهحلهای جایگزین و مناسبتر باشید.
? AmirHossein
? Channel: @DevelopixPHP
ادامه تگ های PHPDoc:@property[<-read|-write>] [Type] [name] []
توصیف ویژگیهای مجازی در کلاس برای استفاده در میجک متد ها.
/**
* @property\-read int $id The ID of the user
* @property string $name The name of the user
*/
class User {}
———@return [Type] []
توصیف خروجی تابع.
/**
* @return float The calculated result
*/
function compute() {
// Implementation
}
———
@see [URI | FQSEN] []
ارجاع به دیگر عناصر مستند.
/**
* @see otherFunction() For basic functionality
*/
———
@since [] []
نشان دهنده نسخهای که عنصر خاصی در آن اضافه یا تغییر کرده است.
/**
* @since 1.0
*/
———
@source [ [] ] []
نمایش قسمتی از کد منبع.
/**
* @source 2 1 Check that ensures lazy counting.
*/
function count()
{
if (null === $this\->count) {
// ...
}
}
———
@subpackage [name]
زیرمجموعهای از بستهای که به آن تعلق دارد.
/**
* @package PSR
* @subpackage Documentation\API
*/
———
@throws [Type] []
استثناءهایی که ممکن است تابع بدهد.
/**
* @throws Exception If the file cannot be opened.
*/
function openFile($filename) {
// Implementation
}
———
@todo [description]
کارهایی که باید در آینده انجام شوند.
/**
* @todo Implement the rest of the method.
*/
———
@uses [FQSEN] []
نشان دهنده استفاده از یک عنصر توسط دیگری.
/**
* @uses functionB() Used by functionA for processing.
*/
———
@var ["Type"] [element_name] []
توصیف نوع یک متغیر، مفید در متغیرهای کلاس.
/**
* @var string $name The name of the person
*/
protected $name;
———
@version [] []
نسخه کد یا کلاس.
/**
* @version 1.0.0
*/
? AmirHossein
? Channel: @DevelopixPHP
PHPDoc یک ابزار مستندسازی برای زبان برنامهنویسی PHP است که از کامنتها برای تولید مستندات فنی استفاده میکند. این ابزار به توسعهدهندگان امکان میدهد تا کدهای خود را به صورت خودکار و با استفاده از تگها و فرمتهای خاص، مستندسازی کنند.
کامنتهای PHPDoc با دو ستاره (/) آغاز میشوند و میتوانند شامل تگهای مختلفی باشند که اطلاعات مهمی را در مورد توابع، کلاسها، ویژگیها و غیره ارائه میدهند. درمورد این تگ ها به طور کامل توضیح داده می شود. نمونه کد:
/**
* Calculate the sum of two numbers.
*
* @param int $a first number
* @param int $b second number
* @return int The sum of two numbers
*/
function add($a, $b) {
return $a + $b;
}
کد بالا پارامتر ها و خروجی تابع را توضیح می دهد.
از آنجایی که PHPDoc ها کامنت هستند توسط PHP تفسیر نمی شوند به همین دلیل در زمان اجرا در دسترس نیستند و برای خواندن آنها باید از ابزار هایی مانند PHPDocumentor استفاده کنید، ولی IDE ها توان تفسیر آنها را دارا می باشند و اگر کتابخانه ای توسعه می دهید به استفاده کننده گان کمک می کنند.
بررسی تگ ها:تگ های PHPDoc با @ شرع می شوند.
@apiنشان دهنده آن دسته از عناصر API است که عمومی تلقی میشوند.
```
class UserService
{
/*
* @api
/
public function getUser() {}
/*
* This method is "package scope", not public-API.
/
public function callMefromAnotherClass() {}
}
```
در مثال بالا متد GetUser به عنوان متد عمومی درون api مشخص شده در صورتی که متد دوم مربوط به api عمومی نیست.
———@author [name] []مشخص کننده نویسنده کد.
/**
* @author John Doe <[email protected]>
*/
———@category [description]
دستهبندی کلی کلاس یا توابع را مشخص میکند.
/**
* @category MyCategory
*/
———@copyright [description]
متن حق کپیرایت را برای کد مشخص میکند.
/**
* @copyright Copyright 1994\-2024 Acme Corporation
*/
———@deprecated [] []
این تگ نشان میدهد که یک تابع یا کلاس دیگر استفاده نمیشود و ممکن است در نسخههای آینده حذف شود.
/**
* @deprecated 2.0 Use newFunction() instead.
*/
function oldFunction() {
}
———@example [location] [ [] ] []
یک فایل نمونه که نحوه استفاده از کد را نشان میدهد.
/**
* @example /path/to/example.php
*/
———@filesource
نشان میدهد که متن کامل فایل باید در مستندات نمایش داده شود.
<?php
/**
* @filesource
*/
———@global [Type] [name]@global [Type] [description]
توضیح میدهد که یک تابع به یک متغیر جهانی دسترسی دارد.
/**
* @global int $GLOBAL\_VAR Description of global variable.
*/
function useGlobal() {
global $GLOBAL\_VAR;
}
———@ignore []
باعث میشود که ابزار مستندسازی یک عنصر خاص را نادیده بگیرد.
/**
* @ignore
*/
define("RUNTIME\_OS","Windows");
———@internal [description]
اطلاعاتی که فقط برای توسعهدهندگان داخلی استفاده میشود.
/**
* @internal This is only for advanced developers.
*/
function count() {}
———@license [] [name]
نوع لایسنس کد را مشخص میکند.
/**
* @license GPL
* OR
* @license https://opensource.org/licenses/gpl\-license.php GNU Public License
*/
———@link [URI] []
لینک به منبع مرتبط.
/**
* @link https://example.com More information here
*/
———@method [[static] return type] name []
توصیف متد مجازی در کلاس، مفید برای کلاسهایی با متدهایی که با مجیک متد (__call) تعریف شدهاند.
/**
* @method int magicMethod(string $param) Description
*/
class MyClass {}
———@package [level 1]\[level 2]\[etc.]
تعریف بستهای که کلاس یا تابع مرتبط با آن است.
/**
* @package Core
*/
———@param [] [name] []
توصیف پارامترهای یک تابع.
/**
* @param int $a First number
* @param int $b Second number
*/
function add($a, $b) {
return $a + $b;
}
ادامه تگ ها در پست بعدی توضیح داده می شود.
? AmirHossein
? Channel: @DevelopixPHP
Attributes ها، ابزاری قدرتمند برای افزودن اطلاعات متا داده به کدهای PHP هستند. این قابلیت برای انواع مختلفی از کاربردها از جمله سریالایزیشن، ولیدیشن، کانفیگیوریشن دیپندنسیها، و مشخص کردن روتهای API مفید است.
در PHP، چندین Attribute به طور پیشفرض تعریف شده است که برای استفادههای مختلف در فریمورکها و کتابخانهها مناسب هستند. این Attributes درونی به شما اجازه میدهند تا با استفاده از امکانات زبان، ویژگیهایی مانند تزریق وابستگی، سریالسازی دادهها، و کنترل دسترسیها را به صورت بومی مدیریت کنید.
اما شما می توانید اتریبیوت های خود را نیز بسازید، ابتدا باید یک Attribute را تعریف کنید. تعریف یک Attribute به سادگی تعریف یک کلاس است که با نماد #[Attribute] مشخص شده است. سپس، این Attribute را میتوانید به کلاسها، متدها، فانکشنها، پراپرتیها، یا حتی پارامترها اختصاص دهید.
فرض کنید میخواهیم یک Attribute برای تعریف نویسندهی یک کلاس یا متد داشته باشیم:
\#[Attribute()]
class Author {
public function \_\_construct(public string $name) {}
}
در این مثال، Author یک Attribute است که نام نویسنده را دریافت میکند. این Attribute را میتوان برای کلاسها و متدها استفاده کرد.
حال، فرض کنید میخواهیم این Attribute را به یک کلاس و متد اختصاص دهیم:
\#[Author("John Doe")]
class SampleClass {
\#[Author("Jane Doe")]
public function exampleMethod() {}
}
برای دسترسی و استفاده از مقادیر تعریف شده توسط Attributes، میتوانید از Reflection API استفاده کنید. این API به شما امکان میدهد در زمان اجرا اطلاعات را استخراج کنید.
```
$reflectionClass = new ReflectionClass(SampleClass::class);
$classAttributes = $reflectionClass->getAttributes(Author::class);
foreach ($classAttributes as $attribute) {
$authorInstance = $attribute->newInstance();
echo "Class Author: " . $authorInstance->name . "\n";
}
$reflectionMethod = $reflectionClass->getMethod('exampleMethod');
$methodAttributes = $reflectionMethod->getAttributes(Author::class);
foreach ($methodAttributes as $attribute) {
$authorInstance = $attribute->newInstance();
echo "Method Author: " . $authorInstance->name . "\n";
}
```
در این مثال، از Reflection API استفاده شده است تا اطلاعات متا دادهای که به کلاس و متد اختصاص داده شدهاند، استخراج شود. این تکنیک قابل استفاده برای انواع مختلفی از کاربردها در زمینههایی مانند دیپندنسی اینجکشن، کانفیگوریشن سرویسها و موارد دیگر است.
Attributes در PHP بر خلاف PHPDoc چیزی فراتر از کامنتها هستند و به طور مستقیم توسط زبان تفسیر میشوند. در نسخههای قبلی PHP، توسعهدهندگان برای قرار دادن متادیتا به صورت کامنتهایی که به صورت دستی تفسیر میشدند (مانند PHPDoc) اتکا میکردند، اما Attributes در PHP 8 و بالاتر به گونهای طراحی شدهاند که به صورت بومی توسط زبان شناخته و مدیریت میشوند.
Attributes به شما این امکان را میدهند که اطلاعاتی را به اجزای مختلف کد مانند کلاسها، توابع، پروپرتیها، و پارامترها متصل کنید. این اطلاعات در زمان اجرا قابل استفاده هستند و میتوانند توسط PHP و ابزارهایی که از Reflection API استفاده میکنند، خوانده شوند.
? AmirHossein
? Channel: @DevelopixPHP
در PHP، عبارت match یک قابلیت نسبتاً جدید است که اولین بار در نسخه 8.0 معرفی شد. این عبارت برای جایگزینی ساختار switch استفاده میشود و به شما امکان میدهد مقادیر را به صورت اختصاصی مقایسه کنید.
در استفاده از match مقادیر را بر اساس === مقایسه میکند، در حالی که switch از مقایسه == استفاده میکند. این به این معناست که match دقیقتر است و تبدیلهای خودکار نوع را انجام نمیدهد.
هر شاخه در match میتواند مستقیماً یک مقدار را برگرداند و نیازی به استفاده از return یا break نیست.
مثال:
```
$statusCode = 404;
$result = match ($statusCode) {
200, 201 => "OK",
301, 302 => "Redirect",
404 => "Not Found",
500 => "Server Error",
default => "Unknown status code"
};
echo $result; // Outputs: Not Found
```
در این مثال، یک متغیر به نام $statusCode
داریم که مقدار آن 404 است. این مقدار نشاندهنده یک کد وضعیت HTTP است که معمولاً برای صفحاتی که یافت نشدهاند به کار میرود. زمانی که $statusCode
با یکی از کلید ها برابر باشد مقدار آن را بر میگرداند، و زمانی که با هیچ یک از کلید ها برابر نباشد مقدار default را بر می گرداند.
خروجی match را میتوان در لحظه return, echo یا درون متغییر ریخت:
```
return match ($statusCode) {
// ...
};
echo match ($statusCode) {
// ...
};
$result = match ($statusCode) {
// ...
};
```
بر خلاف switch-case که میتوان چندین خط را برای هر یک از حالات اجرا کرد در match تنها یک عمل قابل اجرا است:
```
switch (1){
case 1:
$a = 10;
$b = 20;
$c = 30;
echo 'hello';
echo 'bye';
return null;
}
match (1) {
1 => 'hello'
};
```
همانطور که می بینید 6 عمل درون switch-case اجرا شده، اما در match تنها یک خط قابل نوشتن است، اما چندین راه وجود دارد که در match چندین عمل را اجرا کنید.
1- می توانید برای هر حالت یک کلوژر بنویسید و خروجی match را درون متغییر بریزید و آن را اجرا کنید:
$do = match (1){
1=> function (){
echo 'hello';
echo 'bye';
return null;
}
};
$do();
2- میتوانید کلوژر را مستقیما درون match اجرا کنید:
match (1){
1=> (function (){
echo 'hello';
echo 'bye';
return null;
})()
};
3- می توانید یک تابع بنویسید و آن را به match بدهید:
```
function test(){
echo 'hello';
echo 'bye';
return null;
}
$do = match (1){
1=> test()
};
```
در نهایت match یک ابزار قدرتمند و مدرن برای جایگزینی switch در PHP است که به شما امکان میدهد کد خود را دقیقتر و خواناتر بنویسید.
? AmirHossein
? Channel: @DevelopixPHP
عملگرهای &&
, ||
, and
, or
همگی برای انجام عملیاتهای منطقی استفاده میشوند، اما بین آنها تفاوتهایی در اولویت اجرا وجود دارد که میتواند بر روی نتیجه برنامه تأثیر بگذارد.
عملگر &&
بررسی می کند که هر دو مقدار true باشند.
عملگر and
مانند &&
عمل می کند اما با الویت پایین تر.
عملگر ||
بررسی می کند که حداقل یکی از مقادیر true باشد.
عملگر or
نیز مانند ||
عمل می کند اما با الویت پایین تر.
مثال AND:
```
$a = true;
$b = false;
$result = $a && $b; // false
$result = $a and $b; // true
```
در هر دو مثال بالا قرار است که بررسی شود هر دو مقدار true باشند، اما چرا خروجی ها متفاوت اند؟
زمانی که از عملگر &&
استفاده می شود، بررسی می شود که $a
و $b
برابر true باشند. چنانچه یکی از آنها true نبود خروجی false می شود.
اما همانطور که گفته شد عملگر and
نسبت به &&
الویت اجرا پایین تری دارد، یعنی ابتدا $result
برابر $a
قرار می گیرد و سپس and $b
اجرا می شود.
بیایید با استفاده از پرانتز دقیق تر نشان دهیم:
($result = $a) and $b;
مشخص است که $result
برابر $a
قرار گرفته است و $a
هم برابر true است، در نتیجه and $b
تاثیری در نتیجه نخواهد گزاشت و خروجی همان true است.
این مشکل را با گزاشتن پرانتز می توان حل کرد، چرا که پرانتز ها الویت های اجرا را تغییر می دهند:
$result = ($a and $b); // false
در مثال بالا ابتدا داخل پرانتز اجرا می شود و سپس $result
برابر نتیجه می شود.
نتیجه می گیریم عملگر =
سریع تر از and
اجرا می شود درصورتی که &&
سریع تر از =
اجرا می شود.
------
مثال OR:
```
$a = false;
$b = true;
$result = $a || $b; // true
$result = $a or $b; // false
```
در هر دو مثال بالا قرار است که بررسی شود حداقل یکی از مقادیر true باشند، اما چرا خروجی ها متفاوت اند؟
جواب سوال دقیقا مانند AND است.
زمانی که از عملگر ||
استفاده می شود، بررسی می شود که حداقل یکی از $a
یا $b
برابر true باشند. چنانچه هر دو آنها true نبود خروجی false می شود.
اما همانطور که گفته شد عملگر or
نسبت به ||
الویت اجرا پایین تری دارد، یعنی ابتدا $result
برابر $a
قرار می گیرد و سپس or $b
اجرا می شود.
بیایید با استفاده از پرانتز دقیق تر نشان دهیم:
($result = $a) or $b;
مشخص است که $result
برابر $a
قرار گرفته است و $a
هم برابر false است، در نتیجه or $b تاثیری در نتیجه نخواهد گزاشت و خروجی همان false است.
این مشکل را با گزاشتن پرانتز می توان حل کرد، چرا که پرانتز ها الویت های اجرا را تغییر می دهند:
$result = ($a or $b); // true
در مثال بالا ابتدا داخل پرانتز اجرا می شود و سپس $result
برابر نتیجه می شود.
نتیجه می گیریم عملگر =
سریع تر از or
اجرا می شود درصورتی که ||
سریع تر از =
اجرا می شود.
------
بهتر است در استفاده از عملگر ها دقت کنیم تا باعث ایجا مشکل در برنامه نشویم.
ترجیحا از عملگرهای &&
و ||
به جای and
و or
استفاده کنید.
? AmirHossein
? Channel: @DevelopixPHP
در PHP، رفرنسها (References) امکان اشاره به محتوای متغیرها را بدون کپیبرداری از آنها فراهم میکنند. این ویژگی به خصوص در زمانی مفید است که میخواهیم تغییراتی را بر روی متغیرها در یک تابع یا بین بخشهای مختلف برنامه اعمال کنیم بدون اینکه نیاز به بازگرداندن مقادیر باشد.
برای تعریف یک رفرنس، میتوانیم از نشانه & استفاده کنیم. به مثال زیر توجه کنید:
```
$a = 10;
$b = &$a;
$b = 20;
echo $a; // Output: 20
```
در این مثال، متغیر $b به $a رفرنس دارد و هر تغییری در $b منجر به تغییر در $a نیز خواهد شد.
رفرنسها را میتوان در توابع برای تغییر متغیرهایی که به تابع پاس داده میشوند استفاده کرد. نمونه زیر این مورد را نشان میدهد:
```
function add_five(&$value) {
$value += 5;
}
$number = 10;
add_five($number);
echo $number; // Output: 15
```
در این مثال، تابع add_five متغیر $value را به عنوان رفرنس دریافت میکند و هر تغییری که در تابع بر روی این متغیر اعمال شود، در متغیر اصلی نیز منعکس میشود.
رفرنسها همچنین میتوانند در کار با آرایهها بسیار مفید باشند، به خصوص وقتی که میخواهیم تغییراتی را در هر عنصر آرایه اعمال کنیم:
```
$numbers = [1, 2, 3, 4, 5];
foreach ($numbers as &$number) {
$number *= 2;
}
print_r($numbers); // Output: [2, 4, 6, 8, 10]
```
این مثال نشان میدهد که چگونه میتوان با استفاده از رفرنسها در یک حلقه foreach، تمام عناصر یک آرایه را تغییر داد.
بعضی از توابع PHP که مقادیر را کپی میکنند (مانند array_map)، با رفرنسها کار نمیکنند. در این موارد، تغییراتی که به عناصر آرایه اعمال میشوند، بر مقادیر اصلی تأثیری نمیگذارند.
استفاده از رفرنسها در موقعیتهایی مانند متغیرهای سوپرگلوبال، مانند $_POST یا $_GET، ممکن است کار نکند و توصیه نمیشود، زیرا این متغیرها توسط محیط اجرا مدیریت میشوند و مداخله در آنها میتواند نتایج ناخواسته داشته باشد.
رفرنسها میتوانند به بهینهسازی عملکرد برنامه کمک کنند، به ویژه زمانی که با دادههای بزرگ کار میکنید. به جای اینکه دادهها را کپی کنید (که ممکن است فرایندی حافظهبر و زمانبر باشد)، میتوانید از رفرنسها برای اشاره مستقیم به دادههای اصلی استفاده کنید. این موضوع میتواند در مصرف حافظه صرفهجویی کرده و سرعت برنامه را افزایش دهد.
استفاده از رفرنسها در PHP نیازمند دقت است، زیرا تغییرات اعمال شده بر روی رفرنسها مستقیماً بر متغیرهای اصلی تاثیر میگذارند، و این میتواند در صورت عدم توجه به ایجاد باگ منجر شود. به همین دلیل، بسیار مهم است که هنگام استفاده از رفرنسها، کد را به دقت بررسی کنید تا از اعمال تغییرات ناخواسته جلوگیری شود.
? AmirHossein
? Channel: @DevelopixPHP
در PHP، مفهوم variable variables یا متغیرهای متغیر به امکان تعریف و استفاده از متغیرهایی اشاره دارد که نام آنها از مقدار یک متغیر دیگر تعیین میشود. این به شما امکان میدهد تا در زمان اجرا نام متغیرها را مشخص کنید.
```
$Hello = "World";
$a = "Hello";
echo $a; // Hello
echo $$a; // World
```
در مثال یک متغیر به نام $Hello ایجاد شده و به آن رشته World اختصاص داده شده است. همچنین یک متغیر به نام $a ایجاد شده و به آن رشته Hello اختصاص داده شده است.
زمانی که از یک علامت $ استفاده کرده ایم مقدار متغییر $a نمایش داده میشود اما زمانی که از دو علامت $ استفاده شده به معنای متغیری است که نام آن برابر با مقدار $a است.
مقدار $a برابر Hello است، بنابراین $$a معادل با $Hello میشود. و مقدار $Hello برابر World است.
مثال :
فرض کنید میخواهید یک سری متغیر با نامهای متمایزی ایجاد کنید، اما نام آنها را از یک آرایه بگیرید. اینجاست که متغیرهای متغیر به کمک میآیند:
```
$variable_names = array("var1", "var2", "var3");
foreach ($variable_names as $name) {
$$name = rand(1, 100);
}
echo $var1;
echo $var2;
echo $var3;
```
در این مثال، ابتدا یک آرایه با نامهای متغیرها ایجاد میشود. سپس با استفاده از حلقه foreach، برای هر نام متغیر در آرایه، یک متغیر با همان نام ایجاد میشود و به آن یک مقدار تصادفی از ۱ تا ۱۰۰ اختصاص داده میشود. در نهایت، مقادیر متغیرها با استفاده از نام آنها نمایش داده میشود.
شما می توانید به هر تعداد دلخواه $ در php قرار دهید (بر خلاف زندگی عادی):
echo $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$dontTryThisAtHome;
مثال:
```
$Bar = "a";
$Foo = "Bar";
$World = "Foo";
$Hello = "World";
$a = "Hello";
$a; //Returns Hello
$$a; //Returns World
$$$a; //Returns Foo
$$$$a; //Returns Bar
$$$$$a; //Returns a
$$$$$$a; //Returns Hello
$$$$$$$a; //Returns World
//... and so on ...//
```
و حتی به صورت زیر:
```
$nameTypes = array("first", "last", "company");
$name_first = "John";
$name_last = "Doe";
$name_company = "PHP";
foreach($nameTypes as $type)
print ${"name_$type"} . "\n";
print "$name_first\n$name_last\n$name_company\n";
```
با این حال در برخی موارد مانند Superglobal array ها مانند $_SERVER و متغیر $this که از متغیر های خاص هستند این قابلیت غیرقابل استفاده می باشد.
? AmirHossein
? Channel: @DevelopixPHP
در PHP، heredoc و nowdoc دو روش برای تعریف رشتههای چندخطی هستند که میتوانند برای نگهداری متنهای طولانی یا متنهایی که شامل کاراکترهای ویژه هستند، بسیار مفید باشند. این دو روش تفاوتهایی دارند که در ادامه توضیح داده میشود.
Heredoc:Heredoc یک روش است که به کمک علامت <<<EOT (می توان هرچیزی به جای EOT نوشت) باز و بسته میشود.
این علامت میتواند چند حرف یا یک کلمه دلخواه به عنوان نشانگر داشته باشد، (<<<EOT به عنوان مثال).
متن Heredoc بین نشانگر شروع و نشانگر پایان آن قرار میگیرد. Heredoc امکان تفسیر متغیرها را دارد.
مثال:
```
$name = "John";
$text = <<<EOT
Hello $name,
This is a heredoc example.
EOT;
echo $text;
```
Output:Hello John,
This is a heredoc example.
در این مثال، متغیر $name
درون متن heredoc استفاده شده است و مقدار واقعی آن تفسیر و نمایش داده میشود.
———
Nowdoc:Nowdoc بهطور مشابهی به heredoc عمل میکند، با این تفاوت که نمیتواند متغیرها را درون خود تفسیر کند. Nowdoc با استفاده از علامت <<<'EOT' (می توان هرچیزی به جای EOT نوشت) شروع و تا علامت پایانی خود ادامه مییابد.
مثال:
```
$name = "John";
$text = <<<'EOT'
Hello $name,
This is a nowdoc example.
EOT;
echo $text;
```
Output:Hello $name,
This is a nowdoc example.
در این مثال، $name
درون nowdoc استفاده شده است، اما به عنوان رشته خام خوانده میشود، بنابراین نتیجه نهایی متن $name خواهد بود.
———
توجه داشته باشید که هر کاراکتری بدون محدودیت بین Hewedoc و Nowdoc میتواند قرار گیرید. به عنوان مثال:
```
$text = <<<EOT
''
/'
*"
EOT;
echo $text;
```
Output:
*''
*/'
*"
از Heredoc و Nowdoc می توان برای نوشتن تگ های HTML یا JS و ... که دارای کاراکتر های خاص مثال / " ' هستند استفاده کرد.
? AmirHossein
? Channel: @DevelopixPHP
? آدرسهای امضاء شده در لاراول
فرض کنید یک سیستم خبرنامه دارید و کاربری درخواست لغو اشتراک خبرنامه را دارد، URL مربوطه میتواند به شکل زیر باشد:
وقتی کاربری این URL را باز میکند اشتراک خبرنامه کاربری با آیدی 4 لغو خواهد شد، حالا فرض کنید کاربری از روی عمد آیدی 4 را به 60 تغییر بدهد، در این صورت اشتراک خبرنامه کاربری با آیدی 60 هم بدون اطلاع خودش لغو خواهد شد. این سناریو میتواند به مرور باعث لغو اشتراک خبرنامه کلیه کاربران شود؛ یکی از ویژگیهایی که لاراول برای جلوگیری از این خرابکاری دارد، آدرسهای امضاء شده است؛ با استفاده از URL های امضا شده، میتوان تا حدودی از درخواستهای ایجاد شده با URL های اصلاح شده و همچنین از خرابکاریهای احتمالی جلوگیری کرد.
?ساختن یک Signed URL
در مثال بالا فرض کردیم URL لغو اشتراک خبرنامه به شکل زیر است:
در نتیجه روت آن به این شکل خواهد بود:
Route::get('unsubscribe/{user_id}', '...')\->name('unsubscribe');
برای امضاء و امن کردن این URL باید از متد signedRoute که در کلاس URL قرار دارد استفاده کنیم:
$url = URL::signedRoute('unsubscribe', ['user_id' => 1]);
نتیجه کد بالا به شکل زیر خواهد داشت:
example.com/unsubcribe/1/?signature=f834ed8570e05de6c50ad10bd6abcf71e9867fcb14bdf2670b4bf572ce346f3b
و اگر کاربری این URL را تغییر داد به هیچوجه معتبر نخواهد بود و میتوان اینگونه از خراب کاریهای احتمالی جلوگیری کرد؛ همچنین لازم به ذکر است که با متد temporarySignedRoute میتوان یک تاریخ انقضاء برای URL مان مشخص کنیم و تعیین کنیم URL مربوطه تا چه زمانی میتواند معتبر باشد:
`$url = URL::temporarySignedRoute(
'unsubscribe',
now()->addMinutes(60), ['user' => 1]
);`
? اعتبار سنجی آدرسهای امضاء شده
برای اعتبار سنجی آدرسهای مربوطه میتوانید از متد hasValidSignature که در کلاس Request قرار دارد استفاده کنید و بررسی کنید که URL مربوطه معتبر است یا خیر:
`Route::get('unsubscribe/{user_id}``/', function (Request $request) {
if (! $request->hasValidSignature()) {
abort(401);
}
// ...
});`
همچنین میتوانید از میدلور ValidateSignature استفاده کنید تا عملیات اعتبارسنجی خودکار انجام برای استفاده کردن از این میدلور فقط کافی است که به فایل Kernel.php بروید و کد زیر را اضافه کنید:
protected $routeMiddleware = [
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
....
];
و در نتیجه این میدلور را به روتتان اضافه کنید:
Route::get('unsubscribe/{user_id}``', '...')\->name('unsubscribe')\->middleware('signed');
از حالا به بعد این روت زمانی به درستی کار خواهد کرد که مقدار پارامتر signature معتبر باشید در غیر این صورت خطای 403 به کاربر نمایش داده میشود.
?همچنین یک نمونه بسیار ساده از آدرسهای امضاء شده در این مخزن ایجاد کردهام که طبق نیاز میتوانید آن را تغییر داده و استفاده کنید
? اطلاعات بیشتر و داکیومنت مربوطه%3B-,Signed%20URLs,modified%20since%20it%20was%20created.)
? Maryam
? Channel: @DevelopixLaravel
?? ??? ?? ????? ?
We comply with Telegram's guidelines:
- No financial advice or scams
- Ethical and legal content only
- Respectful community
Join us for market updates, airdrops, and crypto education!
Last updated 7 months, 2 weeks ago
[ We are not the first, we try to be the best ]
Last updated 10 months ago
FAST MTPROTO PROXIES FOR TELEGRAM
ads : @IR_proxi_sale
Last updated 6 months ago