شما درگیر ایجاد و تبلیغ یک وب سایت تحت کنترل هستید CMS جوملاو شما ناگهان نیاز به بازسازی به سلیقه و خلق و خوی خود دارید طراحی مطالب با ویرایش الگوهای استاندارد جزء com_content? کامپوننت وظیفه تولید محتوا را بر عهده دارد. بیایید نگاهی به ساختار خود مولفه بیندازیم.

محل قرارگیری الگوی متریال استاندارد

فایل های کامپوننت اصلی com_contentواقع در components\com_content\views\View\tmpl. اگر فایل های کامپوننت در دایرکتوری \templates\template\html\com_content\ که استفاده می کنید کپی شوند، الگوی متریال از فایل های این پوشه گرفته می شود.

دایرکتوری ها و فایل های قالب

دایرکتوری مکان قالب شامل پنج پوشه برای تولید نماها است.

پوشه بایگانی

  • پوشه قالب خروجی را بایگانی کنید. این مقاله در نظر گرفته نمی شود، به ندرت توسط کسی استفاده می شود. ساختار شبیه به پوشه های شرح داده شده در زیر است.

پوشه مقاله - مواد

پوشه صفحه اول - صفحه اصلی

  • default.phpهمان اصل دسته\blog.php;
  • default_item.phpهمان اصل دسته\blog_item.php;
  • default_links.phpهمان اصل دسته\blog_links.php.

پوشه بخش - فصل

  • blog.phpقالب وبلاگ بخش. همان اصل دسته\blog.php;
  • blog_item.phpالگویی برای یک مقاله جداگانه از بخش وبلاگ. همان اصل دسته\blog_item.php;
  • blog_links.phpالگوی ارائه لینک در زیر بخش وبلاگ. همان اصل دسته\blog_links.php.
  • default.phpقالب بخش استاندارد عنوان دسته، توضیحات آن، تعداد عناصر را نمایش می دهد. پس از کلیک بر روی عنوان دسته، صفحه توسط دسته\default.php پردازش می شود.

نمونه ای از ویرایش قالب. تعداد بازدید از مطالب را نشان می دهد.

بیایید بگوییم می خواهیم چاپ تعداد بازدیدهاشخصی مواداز وبلاگ دسته بندی برای این کار، قالب دسته\blog_item.php را ویرایش کنید. کد درج اطلاعات بازدیدها به صورت زیر خواهد بود:

آیتم-> بازدید ?>

اکنون باید در فایل قالب دسته\blog_item.php محل درج این کد را پیدا کنید. به عنوان مثال، قبل از نمایش تاریخ آخرین ویرایش مطالب. به دنبال خط:

item->modified) !=0 && $this->item->params->get("show_modify_date")) : ?>

و قبل از آن یک خط با کد وارد کنید.

مثال فهرست بندی دسته ها در چندین ستون .

رجوع به غیر ارادی ... فرهنگ لغت مترادف و عبارات روسی مشابه در معنی. زیر. ویرایش N. Abramova، M.: لغت نامه های روسی، 1999. ناخودآگاه به طور غریزی، بدون اینکه متوجه شود، خود به خود، وحشت زده، به طور غریزی، بدون اینکه متوجه شود، بدون اینکه متوجه شود، ... فرهنگ لغت مترادف

بی حساب، به طور غریزی، خود به خود، خود به خود، کورکورانه. سانتی متر … فرهنگ لغت مترادف

به طور غیر ارادی، ناخودآگاه، ناخودآگاه، غریزی، مکانیکی، مکانیکی، کورکورانه، خود به خود. تصادفی، ناخواسته؛ خواه ناخواه خواه ناخواه (volens nolens)، از روی ناچاری مجبور شد این کار را به خاطر چیزهایی که خارج از کنترلش بود انجام دهد... ... فرهنگ لغت مترادف

کورکورانه، ناخودآگاه، باطن، بدون اینکه متوجه شود، بدون اینکه متوجه شود، خود به خود، ناخودآگاه، بدون اینکه متوجه شود، ناخودآگاه، مکانیکی، ناخودآگاه، ناخودآگاه، شهودی، ناخودآگاه، حس ششم، به طور غریزی فرهنگ لغت روس ها ... ... فرهنگ لغت مترادف

رجوع به غیر ارادی ... فرهنگ لغت مترادف و عبارات روسی مشابه در معنی. زیر. ویرایش N. Abramova, M.: لغت نامه های روسی، 1999. کورکورانه ناخودآگاه، غیر ارادی. به طور نامشخص، بی پروا، ناخودآگاه، خود به خود، به طور غریزی، بردگی، ناخودآگاه، نامشخص، ... فرهنگ لغت مترادف

adv به غیر پاسخگوها [مادر] می خواست به عقب برگردد، اما ناخودآگاه دوباره جلو رفت. ام. گورکی، مادر. [جودوشکا] از مادر دوست خوبش التماس کرد که به طور ضمنی املاک او را مدیریت کند. سالتیکوف شچدرین، آقایان گولولوف ... فرهنگ لغت کوچک دانشگاهی

گزارش ناپذیر، غیرقابل پاسخگویی، غیرقابل پاسخگویی؛ (مذکر کوتاه استفاده نشده) بی حساب، بی حساب. 1. تحت هیچ گونه کنترلی قرار نمی گیرد، موظف به گزارش نیست. او به طور ضمنی (adv.) در مغازه دور ریخت. 2. وابسته نبودن به ملاحظات منطقی، ... ... فرهنگ لغتاوشاکوف

- (یونانی). شخصی که به او سپرده شده است تا بدون حساب و کتاب به هزینه شخص دیگری تجارت کند. فرهنگ لغات کلمات خارجی موجود در زبان روسی. Chudinov A.N., 1910. ANAGALIST شخصی که به او سپرده شده است تا به هزینه شخص دیگری بدون مسئولیت معامله کند. توضیح…… فرهنگ لغت کلمات خارجی زبان روسی

ناخودآگاه، ناخودآگاه، مکانیکی، غیر ارادی، خودکار، مکانیکی، خودکار، مکانیکی، خلبان خودکار فرهنگ لغت مترادف روسی. به طور خودکار فرهنگ لغت مترادف های زبان روسی را ببینید. راهنمای عملی M.: روسی ... فرهنگ لغت مترادف

رجوع به غیر ارادی ... فرهنگ لغت مترادف و عبارات روسی مشابه در معنی. زیر. ویرایش N. Abramova، M.: لغت نامه های روسی، 1999. به طور غریزی، ناخودآگاه، غیر ارادی. ناخواسته، ناخودآگاه، در درون، خود به خود، خود به خود، ناخودآگاه، کورکورانه، ... فرهنگ لغت مترادف

کتاب ها

  • سفر در چکسلواکی، J. Marko، M. Peterka، پراگ، 1959. آرتیا. با بسیاری از تصاویر عکاسی. صحافی ناشر. ایمنی خوب است. سرگردان مسحور هر کشوری از جهان، با کندوکاو در این کتاب زیبا، قادر به ... دسته: یادداشت های مسافران، خاطرات، تحقیق ناشر: آرتیا,
  • هیئت، یا جلسات در سنایا، گنادی گریگوریف، سرگئی نوسف، مکان‌هایی در سنت پترزبورگ وجود دارند که به سادگی خیال‌آفرین هستند. میدان سنایا یکی از آنهاست. "Sennaya - مهد فانتاسماگوریا". به نظر می رسد خود نویسندگان از آنچه در Sennaya برای آنها اتفاق افتاده است شگفت زده شده اند. بله و... دسته: نثر کلاسیک و مدرن سریال: چهره های دوران ما در پترزبورگناشر:

بسیاری از مردم دوست دارند چنین سازه هایی را به شکلی بنویسند، همه با هم برخورد کرده اند:
foreach ($items به عنوان &$item) ( $item += 2; )
اما خیلی ها از خطری که در کمین اینجاست آگاه نیستند.
یک مثال را در نظر بگیرید.

واسیا پوپکین آرایه ای را برداشت، از آن عبور کرد و تمام عناصر را دو برابر کرد:
$items = آرایه("a" => 10، "b" => 20، "c" => 30،); foreach ($items به عنوان &$item) ( $item += 2; ) print_r($items);
نگاهی به زباله دانی انداختم، دیدم کار حل شد و راضی رفتم:
آرایه ([a] => 12[b] => 22[c] => 32)
پس از مدتی، پتروویچ تصمیم گرفت این بخش از کد را با شمارش دیگری تکمیل کند و در زیر اضافه کند:
$newitems = آرایه("a" => 10، "b" => 20، "c" => 30،); foreach ($newitems به عنوان $key=>$item) ( $newitems[$key] += 5; ) print_r($newitems);
نگاه کرد که تکلیفش هم حل شده است و با حس انجام کار پرونده را بست:
آرایه ([a] => 15 [b] => 25 [c] => 35)
پس از مدتی، اشکالات غیرقابل توضیح شروع به بیرون آمدن کردند. چرا؟
بیایید var_dump($items) را در انتهای کد ایجاد کنیم:
آرایه (3) ( ["a"]=> int(12) ["b"]=> int(22) ["c"]=> &int(30) )
سی واسیا پوپکین قسم می خورد که بررسی کرده است. چرا 32 بود و بعد از کد پتروویچ 30؟

دلیل آن در علامت نهفته است. گزارش می دهد که داده های علامت گذاری شده توسط شخص دیگری ارجاع داده می شود. هنگام خروج، واسیا متغیر موقتی را که برای شمارش ($item) استفاده می کرد، پشت سر خود پاک نکرد. این متغیر با اجازه تغییر منبع ("&") استفاده شد که به آن "تخصیص با مرجع" نیز می‌گویند. او مطمئن بود که این متغیر فقط در داخل حلقه استفاده می شود. پتروویچ با استفاده از متغیری به همین نام، در حین شمارش، مقدار آن را تغییر داد و هر بار محل ذخیره این متغیر تغییر کرد. و در همان مکان آخرین عنصر آرایه Pupkin ذخیره شد.

البته، در مورد در مقاله اغراق آمیز. در عمل، این ارتباطات می تواند بسیار پیچیده باشد، به خصوص اگر پروژه ارزان باشد و شامل توسعه دهندگان وب بی تجربه و متفاوت باشد.

چگونه می توانید این را دور بزنید؟

  • متغیرهای موقت را پس از استفاده از بین ببرید، به خصوص اگر ارتباطی با داده های مورد استفاده داشته باشند:
    foreach ($items به عنوان &$item) $item += 2; unset($item);
  • مراقب متغیرهایی باشید که قبلاً توسط شخصی استفاده شده است.
  • اعمال خود را در توابع، متدها یا فضاهای نام مجزا محصور کنید.
  • به جای print_r از var_dump استفاده کنید و به علامت علامت دقت کنید. برای تخلیه به یک فایل به جای مرورگر، جایگزینی برای print_r($var,true) خواهد بود:
    تابع dump() (ob_start(); foreach(func_get_args() به عنوان $var) var_dump($var)؛ return ob_get_clean(); )
در پایان، من می گویم که اشکالات مربوط به پیوندها نه تنها در foreach وجود دارد. و همه آنها یک بار مورد بحث قرار گرفت. با این حال، این مورد، با توجه به تجربه من، در عمل آنقدر رایج است که سزاوار توجه ویژه است.

بسیاری از خطاهای کشنده و قابل بازیابی به استثنا در PHP 7 تبدیل شده اند. این استثناهای خطا از کلاس Error به ارث برده می شوند که خود رابط Throwable را پیاده سازی می کند (اینترفیس پایه جدید همه استثناها ارث می برند).

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

توضیحات کامل تر از نحوه عملکرد خطاها در PHP 7 را می توان در صفحه خطاهای PHP 7 یافت. این راهنمای مهاجرت صرفاً تغییراتی را که بر سازگاری به عقب تأثیر می‌گذارند، برمی‌شمارد.

// کد دوره PHP 5 که خراب می شود.
کنترل کننده تابع ( استثنا $e ) ( ... )
set_exception_handler("handler");

// PHP 5 و 7 سازگار است.
کنترل کننده تابع ($e) (...)

// فقط PHP 7.
کنترل کننده تابع ($e قابل پرتاب) (...)
?>

سازندگان داخلی همیشه استثناهایی را در مورد شکست ایجاد می کنند

قبلاً برخی از کلاس های داخلی باز می گشتند خالییا یک شی غیرقابل استفاده در هنگام شکست سازنده. اکنون همه کلاس‌های داخلی یک استثنا در این مورد ایجاد می‌کنند، به همان روشی که کلاس‌های کاربر قبلاً مجبور به انجام آن بودند.

E_STRICT متوجه تغییرات شدت می شود

همه ی E_STRICTاعلامیه ها به سطوح دیگر طبقه بندی شده اند. E_STRICTثابت حفظ می شود، بنابراین فراخوانی می شود error_reporting(E_ALL|E_STRICT)خطا ایجاد نخواهد کرد.

E_STRICTتغییرات شدت را متوجه شوید
وضعیت سطح/رفتار جدید
نمایه سازی توسط یک منبع E_NOTICE
روش های استاتیک انتزاعی
"تعریف مجدد" سازنده اعلان حذف شد، هیچ خطایی ایجاد نمی‌کند
عدم تطابق امضا در حین وراثت E_WARNING
خاصیت (سازگار) یکسان در دو صفت استفاده شده است اعلان حذف شد، هیچ خطایی ایجاد نمی‌کند
دسترسی غیراستاتیک به خاصیت استاتیک E_NOTICE
فقط متغیرها باید با مرجع تخصیص داده شوند E_NOTICE
فقط متغیرها باید با مرجع ارسال شوند E_NOTICE
فراخوانی روش های غیر استاتیک به صورت ایستا E_DEPRECATED

تغییرات در مدیریت متغیر

PHP 7 اکنون از یک درخت نحو انتزاعی هنگام تجزیه فایل های منبع استفاده می کند. این باعث شده است که بسیاری از پیشرفت‌ها در زبان انجام شود که قبلاً به دلیل محدودیت‌هایی در تجزیه‌کننده مورد استفاده در نسخه‌های قبلی PHP غیرممکن بود، اما منجر به حذف چند مورد خاص به دلایل سازگاری شد که منجر به شکست‌های سازگاری با عقب شد. این موارد در این بخش به تفصیل بیان شده است.

تغییرات در مدیریت متغیرهای غیرمستقیم، ویژگی‌ها و روش‌ها

دسترسی غیرمستقیم به متغیرها، ویژگی‌ها و روش‌ها بر خلاف ترکیب قبلی موارد خاص، اکنون دقیقاً به ترتیب چپ به راست ارزیابی می‌شود. جدول زیر نشان می دهد که ترتیب ارزشیابی چگونه تغییر کرده است.

ارزیابی قدیمی و جدید عبارات غیر مستقیم
اصطلاح تفسیر PHP 5 تفسیر PHP 7
$$foo["bar"]["baz"] $($foo["bar"]["baz"]) ($$foo)["bar"]["baz"]
$foo->$bar["baz"] $foo->($bar["baz"]) ($foo->$bar)["baz"]
$foo->$bar["baz"]() $foo->($bar["baz"])() ($foo->$bar)["baz"]()
Foo::$bar["baz"]() Foo::($bar["baz"])() (Foo::$bar)["baz"]()

کدی که از ترتیب ارزیابی قدیمی از راست به چپ استفاده می‌کرد، باید بازنویسی شود تا صریحاً از آن ترتیب ارزیابی با پرانتزهای فرفری استفاده شود (به ستون میانی بالا مراجعه کنید). این باعث می‌شود کد هم با PHP 7.x و هم به عقب با PHP 5.x سازگار باشد.

var_dump (1 >> - 1 );
?>

خطای مهلک: خطای محاسباتی کشف نشده: تغییر بیت توسط عدد منفی در /tmp/test.php:2 رد پشته: # 0 (اصلی) در /tmp/test.php در خط 2 پرتاب شده است

bitshifts خارج از محدوده

جابجایی بیتی (در هر جهت) فراتر از عرض بیت an عدد صحیحهمیشه به 0 منجر خواهد شد. پیش از این، رفتار چنین تغییراتی معماری وابسته بود.

تغییرات تقسیم بر صفر

قبلاً، وقتی 0 به عنوان مقسوم‌کننده برای عملگرهای تقسیم (/) یا مدول (%) استفاده می‌شد، یک E_WARNING منتشر می‌شد و نادرستبازگردانده خواهد شد. اکنون، عملگر تقسیم یک شناور را به صورت +INF، -INF یا NAN برمی‌گرداند، همانطور که توسط IEEE 754 مشخص شده است. عملگر مدول E_WARNING حذف شده است و یک استثنا DivisionByZeroError ایجاد می‌کند.

var_dump(3/0);
var_dump(0/0);
var_dump(0 % 0 );
?>

خروجی مثال بالا در PHP 5:

هشدار: تقسیم بر صفر در %s در خط %d bool(false) هشدار: تقسیم بر صفر در %s در خط %d bool(false) هشدار: تقسیم بر صفر در %s در خط %d bool(false)

خروجی مثال بالا در PHP 7:

اخطار: تقسیم بر صفر در %s در خط %d float(INF) هشدار: تقسیم بر صفر در %s در خط %d float(NAN) PHP خطای مرگبار: Uncaaught DivisionByZeroError: مدولو بر صفر در %s خط %d

$str = "0xffff" ;
$int = filter_var ($str , FILTER_VALIDATE_INT , FILTER_FLAG_ALLOW_HEX );
اگر (نادرست === $int ) (
پرتاب جدید Exception ("عدد صحیح نامعتبر!" );
}
var_dump($int ); // int(65535)
?>

\u(ممکن است باعث خطا شود

با توجه به اضافه شدن نحو جدید کد یونیکد فرار از نقطه کد، رشته هایی حاوی یک کلمه \u(به دنبال آن یک دنباله نامعتبر باعث خطای مرگبار می شود. برای جلوگیری از این امر، باید از بک اسلش پیشرو فرار کرد.

توابع حذف شده

دستورالعمل های INI حذف شد

xsl.security_prefs

دستور xsl.security_prefs حذف شده است. در عوض، XsltProcessor::setSecurityPrefs()روش باید برای کنترل تنظیمات امنیتی بر اساس هر پردازنده فراخوانی شود.

سایر تغییرات ناسازگار با عقب

اشیاء جدید را نمی توان با مرجع اختصاص داد

نتیجه از جدیددیگر نمی توان دستور را با مرجع به یک متغیر اختصاص داد:

کلاس C()
$c =& جدید C ;
?>

خروجی مثال بالا در PHP 5:

منسوخ شده: تخصیص مقدار بازگشتی new با مرجع در /tmp/test.php در خط 3 منسوخ شده است.

خروجی مثال بالا در PHP 7:

خطای تجزیه: خطای نحو، "جدید" غیرمنتظره (T_NEW) در /tmp/test.php در خط 3

نام کلاس، رابط و ویژگی نامعتبر است

نام‌های زیر را نمی‌توان برای نام‌گذاری کلاس‌ها، رابط‌ها یا صفات استفاده کرد:

  • بوول
  • بین المللی
  • شناور
  • رشته
  • خالی
  • درست است، واقعی
  • نادرست

ضمناً از نام‌های زیر استفاده نشود. اگرچه آنها خطایی در PHP 7.0 ایجاد نمی کنند، اما برای استفاده در آینده محفوظ هستند و باید منسوخ شده در نظر گرفته شوند.

  • هدف - شی
  • مختلط
  • عددی

برچسب های ASP و اسکریپت PHP حذف شدند

پشتیبانی از استفاده از تگ های ASP و اسکریپت برای محدود کردن کد PHP حذف شده است. برچسب های تحت تأثیر عبارتند از:

برچسب های ASP و اسکریپت را حذف کرد
برچسب باز کردن برچسب بسته شدن
<% %>
<%= %>

تماس‌ها از زمینه ناسازگار حذف شدند

قبلاً در PHP 5.6 منسوخ شده بود، فراخوانی های استاتیکی که با یک متد غیر ایستا با زمینه ناسازگار انجام می شد، اکنون باعث می شود که متد فراخوانی شده دارای یک نام تعریف نشده باشد. این $متغیر و اخطار عدم اعتبار صادر می شود.

کلاس A (
تست تابع عمومی () (var_dump($this);)
}

// توجه: A را گسترش نمی دهد
کلاس B (
تابع عمومی callNonStaticMethodOfA() ( A::test(); )
}

(جدید B)-> callNonStaticMethodOfA();
?>

خروجی مثال بالا در PHP 5.6:

منسوخ شده: روش غیر ایستا A::test() نباید به صورت ایستا فراخوانی شود، با فرض اینکه $this از زمینه ناسازگار در /tmp/test.php در خط 8 شی (B)#1 (0) ( )

خروجی مثال بالا در PHP 7:

منسوخ شده: روش غیر استاتیک A::test() نباید به صورت ایستا در /tmp/test.php در خط 8 فراخوانی شود توجه: متغیر تعریف نشده: این در /tmp/test.php در خط 3 NULL

yield اکنون یک عملگر انجمنی مناسب است

ساختار بازده دیگر نیازی به پرانتز ندارد و به یک عملگر ارتباطی راست با اولویت بین تبدیل شده است. چاپو => . این می تواند منجر به تغییر رفتار شود:

بازده اکو - 1 ;
اکو (بازده) - 1;
// و اکنون به این صورت تعبیر می شود
بازده اکو (- 1 );

بازده $foo یا مرگ;
// قبلاً به این صورت تعبیر شد
بازده ($foo or die);
// و اکنون به این صورت تعبیر می شود
(بازده $foo ) یا مرگ;
?>

می توان از پرانتز برای رفع ابهام آن موارد استفاده کرد.

توابع نمی توانند چندین پارامتر با نام یکسان داشته باشند

دیگر امکان تعریف دو یا چند پارامتر تابع با یک نام وجود ندارد. به عنوان مثال، تابع زیر یک را راه اندازی می کند E_COMPILE_ERROR:

تابع foo ($a , $b , $unused , $unused ) (
}
?>

توابع بازرسی آرگومان ها را گزارش می دهند جاریمقدار پارامتر

func_get_arg(), func_get_args(), debug_backtrace()و بک‌ترس‌های استثنا دیگر مقدار اصلی را که به یک پارامتر ارسال شده گزارش نمی‌کنند، بلکه در عوض مقدار فعلی را ارائه می‌کنند (که ممکن است اصلاح شده باشد).

تابع Foo ($x ) (
$x++;
var_dump(func_get_arg(0));
}
foo (1); ?>

خروجی مثال بالا در PHP 5:

خروجی مثال بالا در PHP 7:

دستورات سوئیچ نمی توانند چندین بلوک پیش فرض داشته باشند

دیگر نمی توان دو یا چند بلوک پیش فرض را در یک دستور سوئیچ تعریف کرد. به عنوان مثال، دستور switch زیر یک را راه اندازی می کند E_COMPILE_ERROR:

سوئیچ (1 ) {
پیش فرض:
زنگ تفريح؛
پیش فرض:
زنگ تفريح؛
}
?>

پسوند JSON با JSOND جایگزین شد

پسوند JSON با JSOND جایگزین شده است که باعث سه شکست جزئی قبل از میلاد شده است. اولاً، یک عدد نباید به اعشار ختم شود (یعنی 34. باید به یکی تغییر کرد 34.0 یا 34 ). ثانیا، هنگام استفاده از نماد علمی، هتوان نباید بلافاصله از یک نقطه اعشار پیروی کند (یعنی 3.e3باید به یکی تغییر کرد 3.0e3یا 3e3). در نهایت، یک رشته خالی دیگر JSON معتبر در نظر گرفته نمی شود.

خرابی عملکرد داخلی در سرریز

قبلاً، توابع داخلی به‌طور بی‌صدا اعداد تولید شده از اجبارهای شناور به عدد صحیح را زمانی که شناور برای نمایش به عنوان یک عدد صحیح بزرگ بود، کوتاه می‌کرد. اکنون یک E_WARNING منتشر خواهد شد و خالیبازگردانده خواهد شد.

مقادیر بازگشتی کنترل کننده جلسه سفارشی را رفع می کند

هر توابع محمولی که توسط کنترل کننده های جلسه سفارشی پیاده سازی شده است که هر دو را برمی گرداند نادرستیا -1 خطاهای مرگبار خواهد بود اگر مقداری از این توابع به جز یک بولی وجود داشته باشد، -1 ، یا 0 برگردانده می شود، سپس از کار می افتد و یک E_WARNING منتشر می شود.

ترتیب عناصر مساوی را مرتب کنید

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

به ترتیب عناصری که به صورت مساوی با هم مقایسه می شوند تکیه نکنید، ممکن است هر زمان تغییر کند.

عبارات شکست و سوئیچ نابجا

زنگ تفريحو ادامه هیدعبارات خارج از یک حلقه یا تعویضساختار کنترل در حال حاضر در زمان کامپایل به جای زمان اجرا مانند قبل شناسایی می شود و an را راه اندازی می کند E_COMPILE_ERROR.

مهم نیست که چقدر از PHP استفاده می کنیم، باز هم برخی از ویژگی ها ظاهر می شوند که حتی نامشان را نشنیده ایم. برخی از آنها برای ما بسیار مفید خواهد بود. من یک لیست کوتاه از ویژگی های مفیدی که هر برنامه نویس PHP باید در زرادخانه خود داشته باشد ایجاد کرده ام.

1. ایجاد توابع با تعداد متغیر آرگومان

احتمالاً می دانید که PHP به ما اجازه می دهد تا توابعی را با آرگومان های اختیاری ایجاد کنیم. حالا تابعی را نشان خواهم داد که در آن تعداد آرگومان ها می تواند از حالتی به مورد دیگر تغییر کند.

اما ابتدا بیایید به یاد بیاوریم که چگونه توابع را به روش معمول ایجاد می کنیم:

// تابع با دو پارامتر اختیاری function foo($arg1 = "", $arg2 = "") ( echo "arg1: $arg1\n"; echo "arg2: $arg2\n"; ) foo("Hello", "جهان")؛ /* خروجی: arg1: hello arg2: world */ foo(); /* خروجی: arg1: arg2: */

حال بیایید ببینیم چگونه می‌توان یک تابع با تعداد نامحدود آرگومان بنویسد. برای این کار از متد ()fuc_get_args استفاده می شود:

// آرگومان‌ها را مشخص نکنید تابع foo() (// آرایه‌ای از آرگومان‌های پاس شده را برمی‌گرداند $args = func_get_args()؛ foreach ($args به عنوان $k => $v) ( echo "arg".($k+1) ." : $v\n"; ) ) foo(); /* خروجی چیزی نیست */ foo("hello"); /* خروجی arg1: hello */ foo("hello", "world", "again"); /* خروجی arg1: hello arg2: world arg3: دوباره */

2. از Glob() برای یافتن فایل ها استفاده کنید

اغلب نام توابع برای خود صحبت می کنند. برای تابع glob() نمی توان همین را گفت.

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

// یافتن همه فایل های php $files = glob("*.php"); print_r ($files); /* خروجی: آرایه ( => phptest.php => pi.php => post_output.php => test.php) */

برای یافتن چندین نوع فایل، باید به صورت زیر بنویسید:

// یافتن همه فایل های php و txt $files = glob("*.(php,txt)", GLOB_BRACE); print_r ($files); خروجی /*: آرایه ( => phptest.php => pi.php => post_output.php => test.php => log.txt => test.txt) */

همچنین می توانید مسیر را در قالب مشخص کنید:

$files = glob("../images/a*.jpg"); print_r ($files); /* خروجی: آرایه ( => ../images/apple.jpg => ../images/art.jpg) */

برای دریافت مسیر کامل یک سند، از متد realpath() استفاده کنید:

$files = glob("../images/a*.jpg"); // تابع "realpath" را به هر عنصر از آرایه اعمال کنید $files = array_map("realpath",$files); print_r ($files); /* خروجی: آرایه ( => C:\wamp\www\images\apple.jpg => C:\wamp\www\images\art.jpg) */

3. اطلاعات مربوط به حافظه استفاده شده

اگر میزان حافظه ای را که توسط اسکریپت های شما مصرف می شود را پیگیری کنید، احتمالاً آنها را بیشتر بهینه می کنید.

PHP یک ابزار قدرتمند ردیابی حافظه دارد. در قسمت های مختلف اسکریپت، بارها می توانند متفاوت باشند. برای بدست آوردن مقدار حافظه استفاده شده در این لحظه، باید از متد memory_get_usage() استفاده کنیم. برای رفع حداکثر مقدار حافظه استفاده شده، از memory_get_peak_usage() استفاده کنید.

echo "Initial: ".memory_get_usage()." bytes \n"; /* اولیه: 361400 بایت */ // یک بار کوچک برای ($i = 0؛ $i) می دهد< 100000; $i++) { $array = md5($i); } // и ещё for ($i = 0; $i < 100000; $i++) { unset($array[$i]); } echo "Final: ".memory_get_usage()." bytes \n"; /* Final: 885912 bytes */ echo "Peak: ".memory_get_peak_usage()." bytes \n"; /* Peak: 13687072 bytes */

4. اطلاعات پردازنده

برای این کار باید از متد getrusage() استفاده کنید. اما توجه داشته باشید که این ویژگی در ویندوز کار نخواهد کرد.

Print_r(getrusage()); /* آرایه را چاپ می کند ( => 0 => 0 => 2 => 3 => 12692 => 764 => 3864 => 94 => 0 => 1 => 67 => 4 => 0 => 0 => 0 => 6269 => 0) */

تصویر ذکر شده در بالا برای کسانی که در این زمینه تجربه دارند واضح خواهد بود مدیریت سیستم. برای بقیه، ما یک رمزگشایی ارائه می دهیم:

  • ru_oublock: تعداد نوشته های بلوک
  • ru_inblock: تعداد دفعات خوانده شده بلوک
  • ru_msgsnd: تعداد پیام های ارسال شده
  • ru_msgrcv: تعداد پیام های دریافتی
  • ru_maxrss: حداکثر اندازه مجموعه بدون صفحه
  • ru_ixrss: کل حافظه مشترک
  • ru_idrss: مقدار کل داده های اشتراک گذاری نشده
  • ru_minflt: تعداد صفحات حافظه استفاده شده
  • ru_majflt: تعداد خطاهای صفحه
  • ru_nsignals: تعداد سیگنال های دریافتی
  • ru_nvcsw: تعداد سوئیچ های زمینه بر اساس فرآیند
  • ru_nivcsw: تعداد سوئیچ های زمینه اجباری
  • ru_nswap: تعداد دسترسی به دیسک در طول صفحه بندی
  • ru_utime.tv_usec: زمان صرف شده در حالت کاربر (میکرو ثانیه)
  • ru_utime.tv_sec: زمان صرف شده در حالت کاربر (ثانیه)
  • ru_stime.tv_usec: زمان حالت ممتاز (میکرو ثانیه)
  • ru_stime.tv_sec: زمان حالت ممتاز (ثانیه)

برای اینکه بفهمید چه منابعی از پردازنده شما توسط اسکریپت استفاده می شود، به مقدار «زمان کاربر» (زمان در حالت کاربر) و «زمان سیستم» (زمان در حالت ممتاز) نیاز دارید. شما می توانید نتیجه را هم در ثانیه و هم در میکروثانیه به دست آورید. به منظور تبدیل تعداد کل ثانیه ها به عدد اعشاری، باید مقدار میکروثانیه را بر 1 میلیون تقسیم کنید و ثانیه ها را به مقدار اضافه کنید.

یه جورایی گیج کننده به عنوان مثال:

// استراحت 3 ثانیه خواب(3); $data = getrusage(); echo "زمان کاربر:". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "زمان سیستم:". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* چاپ زمان کاربر: 0.011552 زمان سیستم: 0 */

اگرچه اسکریپت حدود 3 ثانیه طول کشید تا کامل شود، پردازنده به شدت بارگذاری نشده بود. موضوع این است که در یک تماس (خواب) اسکریپت عملاً منابع پردازنده را مصرف نمی کند. به طور کلی، کارهای زیادی وجود دارند که زمان قابل توجهی را می گیرند، اما از پردازنده استفاده نمی کنند. به عنوان مثال، انتظار برای عملیات مربوط به دیسک. بنابراین شما همیشه از زمان CPU در اسکریپت های خود استفاده نمی کنید.

این هم یک مثال دیگر:

// 10 میلیون بار برای ($i=0;$i<10000000;$i++) { } $data = getrusage(); echo "User time: ". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "System time: ". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* выводит User time: 1.424592 System time: 0.004204 */

اسکریپت 1.4 ثانیه از زمان CPU را گرفت. در این مورد، زمان تماس سیستم به طور کلی کم است.

زمان حالت ممتاز (System Time) زمانی است که پردازنده برای اجرای درخواست‌های سیستم به هسته از طرف برنامه صرف می‌کند. مثال:

$start = microtime(true); // میکروتایم را هر 3 ثانیه تماس بگیرید while(microtime(true) - $start< 3) { } $data = getrusage(); echo "User time: ". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "System time: ". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* выводит User time: 1.088171 System time: 1.675315 */

اکنون زمان سیستم بسیار بیشتر از مثال قبلی صرف شده است. همه به لطف روش microtime () است که از منابع سیستم استفاده می کند.

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

5. ثابت های جادویی

ثابت های جادویی زیادی در PHP وجود دارد مانند شماره خط فعلی (__LINE__)، مسیر فایل (__FILE__)، مسیر فهرست (__DIR__)، نام تابع (__FUNCTION__)، نام کلاس (__CLASS__)، نام متد (__METHOD__) و فضاهای نام (__NAMESPACE__) .

ما همه آنها را در نظر نخواهیم گرفت. بیایید فقط به یک زوج نگاه کنیم:

// این اسکریپت به مکان فعلی فایل بستگی دارد و // اگر از دایرکتوری های مختلف استفاده شود، می تواند مشکلاتی ایجاد کند require_once("config/database.php"); // این اسکریپت مشکلی ایجاد نخواهد کرد. require_once(dirname(__FILE__) . "/config/database.php");

هنگام اشکال‌زدایی اسکریپت‌ها از __LINE__ استفاده کنید:

// کد // ... my_debug("some debug message", __LINE__); /* خروجی خط 4: برخی از پیام های اشکال زدایی */ // کد بیشتر // ... my_debug("دیگر پیام اشکال زدایی"، __LINE__); /* خروجی خط 11: پیام اشکال زدایی دیگر */ تابع my_debug($msg, $line) ( echo "Line $line: $msg\n"؛ )

6. تولید شناسه های منحصر به فرد

مواقعی وجود دارد که باید یک رشته منحصر به فرد ایجاد کنید. بارها دیده ام که از تابع md5() برای حل این مشکل استفاده می شود:

// تولید یک رشته تصادفی echo md5(time() . mt_rand(1,1000000));

اما در واقع PHP یک تابع ()uniqid ویژه برای این منظور دارد.

// یک رشته تصادفی echo uniqid(); /* خروجی 4bd67c947233e */ // یک بار دیگر echo uniqid(); /* چاپ 4bd67c9472340 */

با چشم غیرمسلح می توان دید که کاراکترهای اول تقریباً شبیه به هم هستند ... این به این دلیل است که در این روش از زمان سرور برای تولید کاراکتر استفاده می شود. این حتی مفید است، زیرا. تمام مقادیر تولید شده به ترتیب حروف الفبا به دست می آیند که مرتب سازی سریع آنها را امکان پذیر می کند.

به منظور کاهش شانس دریافت تکراری، می توانیم یک پیشوند اضافه کنیم یا از پارامتر دوم استفاده کنیم (تعداد کاراکترها را افزایش دهیم):

// با پیشوند echo uniqid("foo_"); /* خروجی foo_4bd67d6cd8b8f */ // با پارامتر دوم echo uniqid("",true); /* خروجی 4bd67d6cd8b926.12135106 */ // هر دو echo uniqid("bar_",true); /* چاپ bar_4bd67da367b650.43684647 */

این روش خطوط کوچکتر از md5 تولید می کند، بنابراین می توانید در فضا صرفه جویی کنید.

7. سریال سازی

آیا تا به حال مجبور شده اید داده های پیچیده را در یک پایگاه داده یا فایل ذخیره کنید؟ برای تبدیل یک شی به رشته، PHP تابع خاصی را ارائه می دهد.

به طور کلی، این متدها 2 هستند: serialize() و unserialize()

// آرایه پیچیده $myvar = array("Hello", 42, array(1,"two"), "apple"); // تبدیل به رشته $string = serialize($myvar); echo $string; /* خروجی a:4:(i:0;s:5:"سلام";i:1;i:42;i:2;a:2:(i:0;i:1;i:1;s :3:"two";)i:3;s:5:"apple";) */ // مقدار اصلی را دریافت کنید $newvar = unserialize($string); print_r($newvar); /* آرایه را چاپ می کند ( => سلام => 42 => آرایه ( => 1 => دو) => سیب) */

این توابع اینگونه عمل می کنند. با این حال، به دلیل رشد سریع در محبوبیت JSON، 2 روش json_encode() و json_decode() در PHP 5.2 اضافه شد. کار آنها شبیه به سریال ():

// آرایه پیچیده $myvar = array("Hello", 42, array(1,"two"), "apple"); // تبدیل به رشته $string = json_encode($myvar); echo $string; /* چاپ ["hello",42,,"apple"] */ // بازیابی مقدار اصلی $newvar = json_decode($string); print_r($newvar); /* آرایه را چاپ می کند ( => سلام => 42 => آرایه ( => 1 => دو) => سیب) */

این گزینه فشرده تر و سازگارتر با زبان های دیگر مانند جاوا اسکریپت است. با این حال، هنگام کار با اشیاء بسیار پیچیده، از دست دادن داده ها ممکن است رخ دهد.

8. فشرده سازی رشته

وقتی در مورد فشرده سازی صحبت می کنیم، فایل های آرشیو با فرمت ZIP بلافاصله به ذهن خطور می کنند. PHP قابلیت فشرده سازی را فراهم می کند خطوط طولانیبدون هیچ فایلی

در مثال زیر، عملکرد توابع gzcompress() و gzuncompress() را نشان خواهیم داد:

$string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut elit id mi ultricies adipiscing. Nulla facilisi. Praesent pulvinar, sapien vel feugiat vestibulum, nulla dui pretium orci, non ultricies elit lquisips an lacus. , consectetur adipiscing elit. Aliquam pretium ullamcorper urna quis iaculis. metus، در lacinia augue. Sed magna nisi، ornare in mollis in، mollis sed nunc. Etiam at justo in leo congue mollis. Nullam in neque eget metus hendrerit scelerisque eu non enim. Ut malesuada lacus eu nulla bibendum id euismod urna. ; $compressed = gzcompress($string); echo "اندازه اصلی:". strlen($string)."\n"; /* چاپ اندازه اصلی: 800 */ echo "اندازه فشرده:". strlen($compressed)."\n"; /* خروجی اندازه فشرده: 418 */ // return $original = gzuncompress($compressed);

می توانیم حجم متن را تا 50 درصد کاهش دهیم. برای همین منظور می توانید از متدهای gzencode() و gzdecode() استفاده کنید که از الگوریتم فشرده سازی متفاوتی استفاده می کنند.

9. قبل از اتمام اجرا کنید

PHP دارای یک تابع register_shutdown_function() است که به شما اجازه می دهد تا قبل از خروج اسکریپت کدی را اجرا کنید.

فرض کنید می خواهید اطلاعاتی پیدا کنید... زمان اجرای اسکریپت:

// دریافت زمان شروع $start_time = microtime(true); // برخی از عملیات // ... // چاپ زمان اجرا echo "execution taken:". (microtime(true) - $start_time). "ثانیه"؛

در نگاه اول، ممکن است این یک کار بی اهمیت به نظر برسد. برای این منظور می توانید کد را در انتهای فایل قرار دهید. با این حال، اگر تابع exit() قبلاً در جایی اجرا شده باشد، این کد هرگز کار نخواهد کرد. همچنین اگر خطایی در صفحه وجود داشته باشد یا کاربر بارگذاری صفحه را قطع کند (با کلیک بر روی دکمه مناسب در مرورگر خود) کار نخواهد کرد.

هنگام استفاده از متد register_shutdown_function()، کد به هر حال اجرا می شود:

$start_time = microtime(true); register_shutdown_function("my_shutdown"); تابع my_shutdown() ($start_time جهانی؛ echo "اجرا شد: ". (microtime(true) - $start_time). " ثانیه."; )

نتیجه

PHP یک سیاره کامل است که هرگز با محتوای خود ما را شگفت زده نمی کند. نظر شما در مورد این ویژگی ها چیست؟