PDA

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



idocsidocs
سه شنبه 08 شهریور 1390, 02:32 صبح
من از MVC استفاده می کنم. اسم کلاسی که کار کنترل کردن درخواستها رو انجام می ده class_control خست.

می خوام توی سازنده class_control همه فایلهای مورد نیاز روی اینکلود کنم.

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

لطفا بگید که چطور می تونم این مشکل رو حل کنم؟
ساختار کدها به شکل زیر هست:



class class_control {
function __construct(){
require_once(ROOT.DS.'funcs.php');
}
public function test(){
//استفاده از کی از توابی که داخل فایل اینکلود شده قرار داره
$fortest->check_input()
}
}


محتوای فایل funcs.php به شکل زیر هست:




class funclass {
public function check_input(){
//some code
}
}
$fortest=new funclass ();

Mr.Moghadam
سه شنبه 08 شهریور 1390, 02:40 صبح
شما باید توی فایل index.php که همه درخواستها به اون میره فایلهات رو اینکلود کنی. اگر هم میخوای فایلها و کلاسهای کتابخانه ای و helper ها رو اینکلود کنی نیاز نیست همش رو یه جا اینکلود کنی.

بازم اگه فایلهات رو بذاری بیشتر میشه کمک کرد


موفق باشی

idocsidocs
سه شنبه 08 شهریور 1390, 11:38 صبح
شما باید توی فایل index.php که همه درخواستها به اون میره فایلهات رو اینکلود کنی. اگر هم میخوای فایلها و کلاسهای کتابخانه ای و helper ها رو اینکلود کنی نیاز نیست همش رو یه جا اینکلود کنی.

بازم اگه فایلهات رو بذاری بیشتر میشه کمک کرد


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



class class_control {
function __construct(){
require_once(ROOT.DS.'funcs.php');
}
public function test(){
//استفاده از کی از توابی که داخل فایل اینکلود شده قرار داره
$fortest->check_input()
}
}


محتوای فایل funcs.php به شکل زیر هست:




class funclass {
public function check_input(){
//some code
}
}
$fortest=new funclass ();

Mr.Moghadam
سه شنبه 08 شهریور 1390, 13:30 عصر
توی سازنده اینکلود نکن خوب


function _-construct()
{
$this->init();
}

function init()
{
require_once(ROOT.DS.'funcs.php');
}

Net So
سه شنبه 08 شهریور 1390, 13:35 عصر
دوست عزیز اینها رو بخون ببین کمکت میکنه. یه مثال ساده نوشتم. سعی کن عملکردش رو متوجه بشی :

1.php


<?php
include_once'2.php';
include_once'3.php';


Class Registry {
private $vars = array();
public function __set($index, $value)
{
$this->vars[$index] = $value;
}
public function __get($index)
{
return $this->vars[$index];
}
}


$registrym->c2 = new c2($registrym);
$registrym->c3 = new c3($registrym);
$registrym->c2->a2();
$registrym->c3->a3();
$registrym->c3->loada2p();
?>

2.php


<?php
class c2
{
function __construct($registry) {
$this->registry = $registry;
}





function a2()
{
echo 'a2' ;
echo '<br>' ;
}
function a2p()
{
echo 'secret' ;
echo '<br>' ;
}
}
?>

3.php


<?php
class c3
{

function __construct($registry) {
$this->registry = $registry;
}



function a3()
{
echo 'a3' ;
echo '<br>' ;
}

function loada2p()
{

$this->registry->c2->a2p();
}

}
?>

هر جاش ابهامی بود بگو خط به خط توضیح میدم .

idocsidocs
سه شنبه 08 شهریور 1390, 16:14 عصر
دوست عزیز اینها رو بخون ببین کمکت میکنه. یه مثال ساده نوشتم. سعی کن عملکردش رو متوجه بشی :

هر جاش ابهامی بود بگو خط به خط توضیح میدم .

$this->registry->c2->a2p();
لطفا بگید که کد بالا چه کاری انجام می ده؟

من برای راحتی کار، همه توابعم رو توی فایلهای جداگانه نوشتم تا مجبور به تکرار کد نویسی نشم.

الان توی سازنده یه اتصال به دیتابیس ایجاد می کنم، و اگه بخوام توی توابعی که اینکلود می کنم از این اتصال استفاده کنم (باید توی کلاس اینکلود کننده این توابع، یه شی از همین کلاس بسازم !)، پی اچ پی ارور می ده. چکار کنم که با این مشکل مواجه نشم؟


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

Net So
سه شنبه 08 شهریور 1390, 17:31 عصر
ببین خیلی ساده بگم. فرض کن چندتا کلاس داریم هر کدومشون هم چندتا متود دارن.
اگر بخوایم تو یه کلاس ، به یه متود از همون کلاس دسترسی داشته باشیم با this-> انجام میدیم.
اگر هم بخوایم به یه متود از یه کلاس دیگه احتیاج داشته باشیم باید اونو include کنیم و بعد یه شی جدید ازش بسازیم و از اون طریق بهش دسترسی داشته باشیم درسته ؟
حالا کار این Registry اینه که یه کلاس واحد داری که توش تمام کلاس ها رو اینکلود میکنی.
تو همین فایل Base ای که رجیستری رو ساختیم یکی یه دونه شی از همه ی کلاس ها میسازیم و اصطلاحا با رجیستر ، Global میشن.
ساده هم بگم ، همین رجیستر داره کار Global رو برای متود ها و کلاس ها انجام میده.
مثلا فایل a و b و c رو اینکلود کردی. حالا مخوای تو کلاس A به یه متد از کلاس b دسترسی داشته باشی بدون نیاز به ساخت شی از اون کلاس و اینکلود کردنش. با این روش میتونی اون متود رو اینطوری صدابزنی :

$this->registry->method class b();

و اینکه برو دنبال MVC جواب سوالت توش هست
.
جمع بندیش میشه این :
-> یه کلاسی ایجاد می کنه به سبک singleton و توش پروپرتی ای قرار می دی به شکل آرایه و بعد از بقیه کلاس هات یه شی می سازی و تو این کلاسه و تو پروپرتی مربوطه ذخیرش می کنه
بعد هر کجا خواستی شی کلاس ( مثلا mysql )رو صدا بزنی اینطوری صدا می زنی:
(فرض کن اون کلاسی که شی ها رو تو خودش نگه می داره Registry هست):
کد PHP:

$registry->mysql->select()

این $registy می شه یه شی از همون کلاسی که شی باقی کلاس ها رو توش نگه می داره

بعد این mysql هم می شه شی کلاس mysql ات :
تا اینجاش:
کد PHP:


$registry->mysql


باقیش هم که متد توی mysql رو صدا می زنه

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

idocsidocs
سه شنبه 08 شهریور 1390, 19:48 عصر
ببین خیلی ساده بگم. فرض کن چندتا کلاس داریم هر کدومشون هم چندتا متود دارن.
باقیش هم که متد توی mysql رو صدا می زنه

(توجه کن که شی های هر کلاس رو می تونی انتقال بدی که می تونی یه کلاس جامع ای داشته باشی که همه این شی ها رو تو خودش داشته باشه و ازش می تونی شی باقی کلاس هاتو صدا بزنی و استفاده کنی)
توی مثال زیر که نوشتید متد registrym->c2->a2 رو بیرون از کلاس Registry اجرا می کنید. حالا اگه این کلاس دارای چند متد دیگه باشه و بخواید از متدهای Registry توی سایر کلاسهای اینکلود شده استفاده کنید باید چه روشی در پیش گرفت؟


<?phpinclude_once'2.php';include_once'3.php'; Class Registry { private $vars = array(); public function __set($index, $value) { $this->vars[$index] = $value; } public function __get($index) { return $this->vars[$index]; }} $registrym->c2 = new c2($registrym);$registrym->c3 = new c3($registrym);$registrym->c2->a2();$registrym->c3->a3();$registrym->c3->loada2p();?>

من الان روی این مشکل دارم: یه کلاس کلی به (مثلا به اسم allclasses) ساختم و بقیه متدها و کلاسها رو در زمانهای مورد نیاز توش اینکلود می کنم، من می خوام متدها و کلاسهای اینکلود شده بتونن از متدهای موجود در کلاس allclasses استفاده کنن. برای این مسئله جه روشی پیشنهاد می دید؟

Mr.Moghadam
سه شنبه 08 شهریور 1390, 20:17 عصر
مثالی که دوستمون زدن کامل بود. اما من برای استفاده شخصی از یه کلاس به نام Controller استفاده میکنم که library, helper و . . رو توی اون لود میکنم

function helper($helper)
{
if(is_array($helper))
{
array_map(array('Controller','helper') , $helper);
}
else {
include(BASE.'helper/'.$helper.'.php');
$this->$helper = new $helper();
$this->layout->set($helper , $this->$helper);
}
}

و توی کنترلم به صورت زیر ازش استفاده میکنم



class AdminController extends Controller
{
public function __construct(){
$this->helper(array('User' , ' Paginator'));
}

public function index()
{
$this->Paginator->paginate();
}
}