• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
استفاده از کلاسی بدون لود مستقیم - توسط autoload__
#1
بسم الله الرحمن الرحیم
سلام
همونطوری که می دونید وقتی می خواییم از کلاسی استفاده کنیم می یاییم اون رو به صفحه مربوطه وصلش میکنیم توسط require یا include

حالا اگه اینجا کلی کلاس داشته باشیم که باید به صفحه وصل بشن چی می شه؟ (الکی صفحه شلوغ و بینظم می شه) که واسه این موضوع هم راه حل هایی است که یکیش رو می گم

-یکیش اینه که همه کلاس ها رو تو یه فایلی بزاریم و اونو لود کنیم ( که کار عاقلانه ای نیست )
-دومیش هم اینه که کلاسه رو از طریق تابع autoload__ فراخوانیش کنیم ( رو این مورد بحث می کنم )

واسه این کار می ییایم تابع مورد نظرمون رو توسط autoload می نویسیم و می شه این:
کد پی‌اچ‌پی:
function __autoload($classname){
    require_once 
$classname.'.php';

که الان فرض کنید کلاسی داریم به اسم testclass.php و در کنار فایل index.php هست و کدمون رو به این صورت می نویسیم و استفاده می کنیم:
کد پی‌اچ‌پی:
<?php
/* index.php */

function __autoload($classname){
    require_once 
$classname.'.php';
}

$instance = new testclass();
...
?>
بجای 
<?php
/* index.php */

require_once 'testclass.php';
$instance = new testclass();
?>

الان تو این روش ( کداولی ) بدون اینکه کلاس/کلاسها مون رو مستقیم توسط require یا include لود کنیم می آییم توسط این تابع مون لود می کنیم و استفاده می کنیم و لذت می بریمSmile

حالا اینجا نکته ای هست و اونم اینه که آیا باید این تابع رو تو همه صفحاتمون بزاریم؟ پاسخ خیر هست!

خوب بجای اینکه تو همه صفحاتمون این تابع رو کپیش کنیم می تونیم از php.ini و یا فایل htaccess استفاده کنیم

-استفاده از php.ini برای کسانی که سرور شخصی ندارن و یا هاست اشتراکی هست توصیه نمی شه (و همینطور نمی شه!)
که برای php.ini باید auto_prepend_file رو مقدار دهی کنید و آدرس فایلی که این تابع ( تابعی که نوشتیم ) توش هست رو می دید

- و یا می شه از طریق فایل htaccess اقدام کرد که کسانی که وب سرورشون آپاچی هست می تونن ازش استفاده کنن و دستورش هم به شرح زیر هست:
کد پی‌اچ‌پی:
<IfModule mod_php5.c>
  
php_value auto_prepend_file "auto_loader.php"
</IfModule

* خوب تو این روش php.ini و یا htaccess هم باید این تابع ای که نوشتیم رو تو یه فایلی بزاریم ومثلا auto_loader.php و آدرسش رو به php.ini ویا htaccess می دیم و خلاص / که در این صورت نه نیازه کلاس/کلاس ها رو خودمون لود کنیم و نه نیازی هست این تابع رو همه جا کپیش کنیم و خودش load خواهد کرد
که در اینصورت کدمون می تونه به این صورت باشه:
کد پی‌اچ‌پی:
<?php
/* index.php */

$instance = new testclass();
...
?>
بجای
<?php
/* index.php */

function __autoload($classname){
    require_once 
$classname.'.php';
}

$instance = new testclass();
...
?>

اینم مثالی برای این مطلب:
کد:
http://hotfile.com/dl/110769703/0385b00/autoload.zip.html
  پاسخ
تشکر شده توسط : cyletech oia hamid_80386 zoghal Y.P.Y
#2
یه نکته که داره اونم راجع به اسم کلاس هامون
اولآ و قتی که کلاس هامون خیلی می شن بهتر شکل کتابخونه بگیرن!
دوم باید از یک قاعده برای نام گذاری استفاده کر تا بشه از این تابع برای auto_load کردن کلاس ها بهتر استفاده کردن
-- قبول دارید که نمی شه چنین تابعی رو نوشت در حالی که آدرس کلاس هامون هرگز با نام کلاس هامون ربطی نداره؟!
-- چونکه ما داریم از نام کلاس آدرس رو می سازیم!

خب پس چی کار باید کرد؟
یه نمونه درستش رو بهتون آدرس می دم! کتابخونه Zend رو یه نگاهی بندازید و اینکه چطور کلاس Loder کلاس ها رو لود می کنه
می شه یا استفاده از namespace ها کاره جدیدتری بسازید!!
  پاسخ
تشکر شده توسط : hosseintdk775 hamid_80386
#3
محمد جان کلاً ممنون میشم اگه وقت کردی یه تاپیک مجزا در مورد کارایی های این NameSpace ها تو php بزاری (چون مثل اینکه زیادم استفاده میکنه از این option Rolleyes)، مقل اینکه چیزه خوبیه Smile
هر که با مرغ هوا دوست شود - خوابش آرامترین خواب جهان خواهد بود.
  پاسخ
تشکر شده توسط :
#4
این بحث مربوط به اتولود هستش
شاید درست نباشه منحرفش کنیم. البته بی ربط هم نیست.

--
namespace
لینک : http://php.net/manual/en/language.namespaces.php
لینک : http://php.net/manual/en/language.namesp...orting.php

اصل استفاده :
مثال: وقتی بخوای توی یک فولدر یک فایل رو ایجاد کنی. به شرطی می تونی ایجادش کنه که فایلی با اون نام وجود نداشته باشه. ما نمی تونیم توی یک پوشه دوتا فایل پا پوشه هم نام داشته باشیم. نمی شه دوتا فایل iranphp.txt تو یک پوشه داشت.
اما اگه هر فایل iranphp.txt رو توی یک زیر پوشه قرار بدیم می تون 1000 (بی شمار) تا iranphp.txt داشته بشیم
کد:
root/dir1/iranphp.txt
root/dir2/iranphp.txt
root/dir3/iranphp.txt
...
root/dir98/iranphp.txt
root/dir99/iranphp.txt
root/dir100/iranphp.txt
...
تقریبا هم namespace یه وضعیت مشابه داره.
با استفاده از namespace ها
می تونیم کلاس های و متد ها و constant های مشابه داشته باشیم در فضای نام های متفاوت
می تونیم ازکلاس های هم نام در فضای نام (namespace) های متفاوت استفاده کنیم
می تونیم از کتابخونه ها ی مختلفی استفاده کنیم. بدون ترس از اینکه مبادا بدیلیل تشابه اسمی برنامه نتونه اجرا بشه.
  پاسخ
تشکر شده توسط : hamid_80386
#5
در جهت تفهیم ساده عرض کنم . namespace شبیه نام خانوادگی میمونه .
دیدی سر کلاس مثلاً دو تا حمید داریم وقتی استاد اسمارو میخونه واسه حضور غیاب به اون دو تا حمید که میرسه مثلاً میگه حمید رضایی ، بعد حمید عباسی اونا رو که رد میکنه مثلاً میرسه به من میگه رضا دیگه فامیل نمیگه .Big Grin
این اینجوریه دیگه .Big Grin
وبلاگ rezaonline.net/blog
سفارش برنامه نویسی reza.biz
Php , mysql , postgresql , redis , Yii and ... Cool
  پاسخ
تشکر شده توسط : oia hamid_80386


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان