از زیباییهای Typenoscript:
interface Todo {
noscript: string;
}
const todo: Readonly<Todo> = {
noscript: "Delete inactive users",
};
todo.noscript = "Hello";
⛔️ Cannot assign to 'noscript' because it is a read-only property.👍1
Philocode
از زیباییهای Typenoscript: interface Todo { noscript: string; } const todo: Readonly<Todo> = { noscript: "Delete inactive users", }; todo.noscript = "Hello"; ⛔️ Cannot assign to 'noscript' because it is a read-only property.
البته توی PHP هم میتونیم مثل این رو داشته باشیم، ولی از Utility Typeها خبری نیست و باید داخل خود کلاس تعریف بشه:
اینطوری بیرون از آبجکت نمیشه پراپرتیهارو تغییر داد.
class Developer⛔️ Error: Cannot modify readonly property Developer::$name...
{
public readonly name;
}
$developer = new Developer();
$developer->name = 'John';
اینطوری بیرون از آبجکت نمیشه پراپرتیهارو تغییر داد.
👍1
Philocode
تعریفکردن کلاسها به صورت final، چرا؟ اگه کلمۀ کلیدی final رو به کلاسی اضافه کنیم، امکان extendکردن اون کلاس وجود نخواهد داشت. مثال: <?php final class A {} class B extends A {} خروجی: PHP Fatal error: Class B may not inherit from final class (A) میفرمایند…
استثنایی که برای این میتونه وجود داشته باشه، دیزاین پترن Template ــــه.
این مثال رو بیبنید:
اینجا overrideکردن جزئی از ذات این پترنه و معنی نداره با final از overrideشدنش جلوگیری کنیم!
این مثال رو بیبنید:
class SomeJobمثلاً اون چهارتا متد، روی همون کلاس SomeJob تعریف شدند و هر کدوم از اونها، مرحلهای از انجام کاره؛ مثلاً اولی روغن میریزه، دومی تخم مرغ رو اضافه میکنه، سومی نمک رو اضافه میکنه و چهارمی هم یه چیز دیگه. Template Pattern میگه بذارید که این مراحل قابل overrideکردن باشند، تا بشه بعضی از این مراحل رو توی کلاسی که از این کلاس ارث میبره، تغییر داد؛ مثلاً به جای مرحلۀ سوم که نمک میریزه، مرگ موش اضافه کنه. (چه مثال دارکی)
{
public function handle()
{
$this->firstStep();
$this->secondStep();
$this->thirdStep();
$this->fourthStep();
}
}
اینجا overrideکردن جزئی از ذات این پترنه و معنی نداره با final از overrideشدنش جلوگیری کنیم!
ساختار لاراول بر اساس Technical Responsibilityهاست، بر خلاف Nest.js که پروژه رو بر حسب ماژول تقسیم میکنه و میشه بر اساس Domain Modelها پروژه رو پیش برد.
👍1😱1
Philocode
https://www.youtube.com/watch?v=DuB6UjEsY_Y
میدونستید چرا توی PHP متغیرهامون $ دارن؟
ربطی به پولدوستبودن راسموس نداره؛ صرفاً هدف این بوده که وقتی متغیر رو داخل یه string میذاری، قاطی نشه! 😁
ربطی به پولدوستبودن راسموس نداره؛ صرفاً هدف این بوده که وقتی متغیر رو داخل یه string میذاری، قاطی نشه! 😁
😁4
اگه میخوایید REST API رو خیلی عمیق بفهمید و مصاحبهکنندۀ بعدی رو خَجَل کنید، این چند صفحه رو بخونید:
https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm
https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm
👍3🔥2😁1
متد DELETE توی REST API باید idempotent باشه. یعنی اگه من صد بار این ریکوست رو بفرستم:
DELETE
نباید state تغییر کنه، فقط و فقط یک ریسورس (که همون دانشآموز کوشا و محترم شمارۀ 45 ــه) حذف میشه و دفعات بعدی هم اتفاق جدیدی برای ریسورس student رخ نمیده و صرفاً خطای 404 برمیگرده.
حالا چرا این مسئله مهمه؟ برای اینکه ممکنه به دلایل عمدی یا غیر عمدی (مثل خطای شبکه)، یک ریکوست، بیشتر از یکبار ارسال بشه.
مثال قبلی درست بود، ولی این مثال رو ببینید:
DELETE
در اینجا با هر بار صدازدن، آخرین نمونه از ریسورس student حذف میشه و اگه دهبار صدا بزنیم، دهتا ریسورس مختلف حذف میشن! چنین چیزی اشتباهه، چون قرار بود که متد DELETE به صورت idempotent کار کنه!
DELETE
/api/students/45نباید state تغییر کنه، فقط و فقط یک ریسورس (که همون دانشآموز کوشا و محترم شمارۀ 45 ــه) حذف میشه و دفعات بعدی هم اتفاق جدیدی برای ریسورس student رخ نمیده و صرفاً خطای 404 برمیگرده.
حالا چرا این مسئله مهمه؟ برای اینکه ممکنه به دلایل عمدی یا غیر عمدی (مثل خطای شبکه)، یک ریکوست، بیشتر از یکبار ارسال بشه.
مثال قبلی درست بود، ولی این مثال رو ببینید:
DELETE
/api/students/lastدر اینجا با هر بار صدازدن، آخرین نمونه از ریسورس student حذف میشه و اگه دهبار صدا بزنیم، دهتا ریسورس مختلف حذف میشن! چنین چیزی اشتباهه، چون قرار بود که متد DELETE به صورت idempotent کار کنه!
🔥7
Philocode
Photo
قبلاً ایدۀ این رو داشتم که آدمها کپچا رو بزنن، و ربات فرم رو پر کنه.
چیزی که وقتگیره، پرکردن فرم با دیتاهای فیکه، نه زدن کپچا!
کافیه پکیج faker رو نصب کنیم و با Selenium یا ابزار مشابهی صفحه رو باز کنیم!
چیزی که وقتگیره، پرکردن فرم با دیتاهای فیکه، نه زدن کپچا!
کافیه پکیج faker رو نصب کنیم و با Selenium یا ابزار مشابهی صفحه رو باز کنیم!