PDA

View Full Version : گفتگو: درست کردن کتاب خانه ای از کلاس ها



masiha68
جمعه 02 اسفند 1392, 13:46 عصر
سلام
من واسه ی اینکه همیشه به کلاس ها دسترسی داشته باشم اونا رو توی یه فایل اینلکود می کنم و بعد هم اون فایل رو توی فایل کانفیگ اینکلود می کنم . با این کار هرجا هر به هر کلاسی نیاز داشته باشم به راحتی اونو فراخوانی می کنم.
سوال من اینکه این کار چقد اصولی هستش و از نظر امنیت امکان داره چه مشکلی پیش بیاد
و اینکه چرا گاهی وقتی دوتا کلاس رو اکستند هم می کنم می گه اون اون کلاس وجود نداره
Fatal error: Class 'temp' not found in G:\wamp\www\cms\class\plugin.class.php on line 3
در حالی که ترتیب اینلود کردن رو هم رعایت کردم .

Tarragon
جمعه 02 اسفند 1392, 14:16 عصر
سلام
از دستور __autoload استفاده کنید.

masiha68
جمعه 02 اسفند 1392, 14:18 عصر
توضیحات بیشتر بدین ... کجا باید ازش استفاده کنم و....

foreach
جمعه 02 اسفند 1392, 14:37 عصر
توضیحات بیشتر بدین ... کجا باید ازش استفاده کنم و....

اینطور که همه کلاس ها رو با هم اینکلود میکنید اگر کلاس ها بیش از حد زیاد بشه به مشکل بر میخورید
میتونید از __autoload یا spl_autoload_register استفاده کنید , طوری که وقتی یک شی از یک کلاس ساختید اون کلاس به صورت خودکار اینکلود بشه


function __autoload($class){
$path = "app/classes/{$class}.php";

if(!file_exists($path))
die('not found');
include_once($path);
}

که اگر اشتباه نکنم به این روش Lazy Loading میگن

masiha68
جمعه 02 اسفند 1392, 15:05 عصر
اینطور که همه کلاس ها رو با هم اینکلود میکنید اگر کلاس ها بیش از حد زیاد بشه به مشکل بر میخورید
میتونید از __autoload یا spl_autoload_register استفاده کنید , طوری که وقتی یک شی از یک کلاس ساختید اون کلاس به صورت خودکار اینکلود بشه


function __autoload($class){
$path = "app/classes/{$class}.php";

if(!file_exists($path))
die('not found');
include_once($path);
}

که اگر اشتباه نکنم به این روش Lazy Loading میگن

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

MRmoon
جمعه 02 اسفند 1392, 15:08 عصر
میشه بگین یعنی چی دوتا کلاس اکستند هم باشند؟

masiha68
جمعه 02 اسفند 1392, 15:10 عصر
میشه بگین یعنی چی دوتا کلاس اکستند هم باشند؟
َشرمنده زیاد با اصلاحات شی گرایی اشنایی نیستم :)
منظورم اینه یکی از یکی ارث بری کنه . یکی پدر و یکی پسر ... یا هر چیز دیگه ای extends

masiha68
جمعه 02 اسفند 1392, 15:23 عصر
خب فک کنم جواب این تابع بشه

function getclass($class)
{
if(is_array($class))
{
foreach($class as $row)
{
if(file_exists($row))
{
include_once $row;
}
}
}
else
{
echo "this is not array";
}
}
getclass(array('a'=>'class1.php','b'=>'class2.php'));


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

MRmoon
جمعه 02 اسفند 1392, 20:35 عصر
خب فک کنم جواب این تابع بشه

function getclass($class)
{
if(is_array($class))
{
foreach($class as $row)
{
if(file_exists($row))
{
include_once $row;
}
}
}
else
{
echo "this is not array";
}
}
getclass(array('a'=>'class1.php','b'=>'class2.php'));


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

فکر نمی کنین استفاده از __autoload() بهتر باشه؟؟اینجوری لازم نیست تابع خاصی رو قراخوانی کنیم!!!

در ضمن همه کلاسا اگه وجود وجودد نداشته باشن به اتولودر پاس داده میشن! ربطی نداره اینترفیسه یا آبسترکت یا این یکی پدر اون یکی این یکی پسر اون یکی و از این حرفا :لبخند:

masiha68
جمعه 02 اسفند 1392, 20:42 عصر
یکی بیاد منو تفهیم کنه ...من هنوز قضیه ی این __autoload رو نگرفتم . اینم مثل تابع من یه تابعه ؟ نیست ! هست . یه اروگومان می گیره .. ولی شاید ما بخواییم بیشتر از یک کلاس لود بشه که من از ارایه استفاده کردم ....

foreach
جمعه 02 اسفند 1392, 21:16 عصر
یکی بیاد منو تفهیم کنه ...من هنوز قضیه ی این __autoload رو نگرفتم . اینم مثل تابع من یه تابعه ؟ نیست ! هست . یه اروگومان می گیره .. ولی شاید ما بخواییم بیشتر از یک کلاس لود بشه که من از ارایه استفاده کردم ....

ببینید دوست عزیز __autoload یک تابع که نیازی به تعریف دوبارش نیست و در خود پی اچ پی موجوده
شما وقتی از یه کلاسی شی میسازید و یا به قول شما یک کلاس رو فرزند کلاس دیگه ای میکنید این تابع صدا زده میشه در صورتی که اون کلاس اینکلود نشده باشه نام اون کلاسی که قراره ازش یک شی ساخته بشه رو به عنوان Argument به تابع میده
حالا شما میتونید این وسط بیاید کلاس رو اینکلود کنید و یا چند کاراکتر اول نام کلاس رو بگیرید و بر اساس اون تشخیص بدید که چه کلاسی از چه مسیری اینکلود بشه و یا یک فایل از آرایه ای از نام و مسیر فایل ها رو بسازید و در تابع __autoload چک کنید که اگر نام کلاس در آرایه وجود داشت مسیر اینکلود رو از آرایه بگیره
اطلاعات بیشتر : http://ir2.php.net/autoload