PDA

View Full Version : مشکل در استفاده از یک کلاس در کلاس دیگر



dbb426
جمعه 16 مرداد 1394, 15:09 عصر
سلام
من یک کلاس برای وصل شدن به دیتابیس دارم

class Database{
private $connect;
public function __construct($host,$user,$pass,$dbname){
$this->connect = mysql_connect($host,$user,$pass);
mysql_select_db($dbname,$this->connect);
}
public function SelectDB(){
$select="select * from posts ORDER BY id DESC";
$query=mysql_query($select,$this->connect);
}
}
$db = new Database('localhost','user','pass','dbname');
$db->SelectDB();

حالا می خوام از این کلاس توی بقیه کلاس هام استفاده کنم .البته الان توی __construct دارم استفاده میکنم اما مشکلی که داره اینکه تو هر کلاس هی وصل میشه به دیتابیس و این اصلا اصولی نیست
کسی میتونه راهنماییم کنه

Mohammadsgh
شنبه 17 مرداد 1394, 01:17 صبح
میشه بگید چیش اصولی نیست؟اشکال داره همیشه به دیتابیس وصل بشید؟:متفکر:

dbb426
شنبه 17 مرداد 1394, 08:13 صبح
میشه بگید چیش اصولی نیست؟اشکال داره همیشه به دیتابیس وصل بشید؟:متفکر:

اینکه توی هر کلاس داره به دیتابیس وصل میشه .خوب من نزدیک 6 تا کلاس دارم .تو هر کلاس هی وصل میشه به دیتابیس.این اصولی نیست .چون مدت زمان لود سایتمو خیلی آورده پایین.
من توی کلاس دیتابیسم چند تا تابع دارم که میخوام توی کلاسام ازش استفاده کنم .یعنی میخوام اول یه شی بیرون کلاس ایجاد کنم بعد از اون شی توی بقیه کلاسام استفاده کنم
نمیدونم منظورمو رسوندم یا نه

us1234
شنبه 17 مرداد 1394, 08:25 صبح
اینکه توی هر کلاس داره به دیتابیس وصل میشه .خوب من نزدیک 6 تا کلاس دارم .تو هر کلاس هی وصل میشه به دیتابیس.این اصولی نیست .چون مدت زمان لود سایتمو خیلی آورده پایین.
من توی کلاس دیتابیسم چند تا تابع دارم که میخوام توی کلاسام ازش استفاده کنم .یعنی میخوام اول یه شی بیرون کلاس ایجاد کنم بعد از اون شی توی بقیه کلاسام استفاده کنم
نمیدونم منظورمو رسوندم یا نه

فقط یکبار اون هم داخل فایل init.php به دیتابیس وصل شوید .

init فایل است که کلیه کلاس های شما new instant میشود ...

dbb426
شنبه 17 مرداد 1394, 08:42 صبح
فقط یکبار اون هم داخل فایل init.php به دیتابیس وصل شوید .

init فایل است که کلیه کلاس های شما new instant میشود ...

فکر میکنم متوجه منظورم نشدین.

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


class Database{
private $connect;
function __construct($host,$user,$pass,$dbname){
$this->connect = mysql_connect($host,$user,$pass);
mysql_select_db($dbname,$this->connect);
}
function SelectDB(){
$select="select * from posts ORDER BY id DESC";
$query=mysql_query($select,$this->connect);
}
function Query($query){
mysql_query( $query ) ;
}
}
$db = new Database('localhost','user','pass','dbname');
$db->SelectDB();

class test{

function a(){
$db->Query('select * from test');
}
}

توی کلاس تست میخوام از تابع Query کلاس Database استفاده کنم

us1234
شنبه 17 مرداد 1394, 10:03 صبح
متوجه منظور شما شدم

ببیند این قسمت :



$db = new Database('localhost','user','pass','dbname');
$db->SelectDB();


نه جز کلاس اول است نه دوم کلا این که وسط یک فایل new instant می زنید اشتباه است .

شما باید یک فایل درست کنید به نام int.php یا هر چی که خودتون دوست دارید و هر جا که در لایه V از مدلینگ MVC قرار گرفتید این کلاس را include کنید .

مثلا من یک فایل index.php ، یک فایل db.php و یک کلاس user.php دارم که مربوط به پردازش کاربران است و داخلش آن از کلاس Db استفاده شده .
در این حالت نیاز نیست در فایل user فایل db را include کنم .

بلکه یک فایل به نام int.php درست میکنم که داخلش به این شکل است :



include('db.php');
$db = new Database('localhost','user','pass','dbname');
$db->SelectDB();

include('user.php');
$user = new user();


و فایل int.php فقط در فایل index.php انکلود میشود ...

و داخل کلاس user هرجا خواستم از db استفاده کنم متغییر $db را Global تعریف میکنم .

dbb426
شنبه 17 مرداد 1394, 10:41 صبح
ممنون حل شد .
من قبلش هم دقیقا همینطور که گفتی پیاده کرده بودم فقط $db به صورت global تعریف نکرده بودم
مرسی

dbb426
شنبه 17 مرداد 1394, 10:41 صبح
متوجه منظور شما شدم

ببیند این قسمت :



$db = new Database('localhost','user','pass','dbname');
$db->SelectDB();


نه جز کلاس اول است نه دوم کلا این که وسط یک فایل new instant می زنید اشتباه است .

شما باید یک فایل درست کنید به نام int.php یا هر چی که خودتون دوست دارید و هر جا که در لایه V از مدلینگ MVC قرار گرفتید این کلاس را include کنید .

مثلا من یک فایل index.php ، یک فایل db.php و یک کلاس user.php دارم که مربوط به پردازش کاربران است و داخلش آن از کلاس Db استفاده شده .
در این حالت نیاز نیست در فایل user فایل db را include کنم .

بلکه یک فایل به نام int.php درست میکنم که داخلش به این شکل است :



include('db.php');
$db = new Database('localhost','user','pass','dbname');
$db->SelectDB();

include('user.php');
$user = new user();


و فایل int.php فقط در فایل index.php انکلود میشود ...

و داخل کلاس user هرجا خواستم از db استفاده کنم متغییر $db را Global تعریف میکنم .

ممنون حل شد .
من قبلش هم دقیقا همینطور که گفتی پیاده کرده بودم فقط $db به صورت global تعریف نکرده بودم
مرسی

hamedarian2009
شنبه 17 مرداد 1394, 17:02 عصر
شما باید از معماری Singleton استفاده کنید تا این چنین مشکلاتی نداشته باشید در این مورد جستجو کنید