PDA

View Full Version : مشکل با mvc خودم !



redhat2
سه شنبه 17 بهمن 1391, 11:02 صبح
سلام من این mvc را نوشتم : ولی نیدونم چرا تویه صفحه ی index وقتی میخوام به کلاس Database دسترسی پیدا کنم میگه که کلاس شما وجود ندارد . کد را پیوست کردم .

index.php



require_once 'libs/config.php';
require_once 'libs/autoloader.php';
$name = Database::getInstnace();


config.php :



class Config {

public function __construct() {
return array(
'path' => array(
'path_home' => 'http://localhost/mvc',
'path_controller' => 'controllers',
'path_model' => 'model',
'path_view' => 'views',
'path_libs' => 'libs',
'path_directory' => DIRECTORY_SEPARATOR
),
'db' => array(
'db_local' => 'localhost',
'db_user' => 'root',
'db_pass' => '',
'db_name' => 'mvc'
)
);
}

}


database :



<?php

class Database {

protected $_config;
public static $_connect;
public static $_getInstance;

function __construct() {
$this->_config = new Config();
}

function _connect() {
self::$_connect = new PDO('mysql:local=' . $this->_config['db']['db_local'] . ';dbname=' . $this->_config['db']['db_name'] . '',
$this->_config['db']['db_user'],
$this->_config['db']['db_pass']);
return self::$_connect;
}

public static function getInstance() {
if (!isset(self::$_getInstance) || self::$_getInstance instanceof Database) {
self::$_getInstance = new Database();
}
return self::$_getInstance;
}

}

?>



autoloader.php :



<?php

class Autoloader {

private $_config = array();

public function __construct() {
$this->_config = new Config();
}
public static function autoload($class)
{
$home = $this->_config['path']['path_home'];
$ds = $this->_config['path']['path_directory'];
if(file_exists($home . $ds . $this->_config['path']['path_libs'] . $ds . $class . '.php'))
{
require_once $home . $ds . $this->_config['path']['path_libs'] . $ds . $class . '.php';
}
}
}
spl_autoload_register(array('Autoloader','autoload '));
?>



تصویر ارور را هم پیوست کردم .

Reza1607
سه شنبه 17 بهمن 1391, 11:16 صبح
اصلا خطاي شما ربطي به ديتابيس نداره
شما متد رو به صورت استاتيك تعريف كردين و بايد براي دسترسي به پروپرتي ها به اين صورت عمل كنيد

self::$_config
البته بايد پروپرتي رو هم به صورت استاتيك بنويسيد اينجوري

private static $_config = array();

و هرجا خواستيد به اين پروپرتي دسترسي داشته باشيد از كد اول استفاده كنيد

redhat2
سه شنبه 17 بهمن 1391, 12:11 عصر
اصلا خطاي شما ربطي به ديتابيس نداره
شما متد رو به صورت استاتيك تعريف كردين و بايد براي دسترسي به پروپرتي ها به اين صورت عمل كنيد

self::$_config
البته بايد پروپرتي رو هم به صورت استاتيك بنويسيد اينجوري

private static $_config = array();

و هرجا خواستيد به اين پروپرتي دسترسي داشته باشيد از كد اول استفاده كنيد

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

Reza1607
سه شنبه 17 بهمن 1391, 12:19 عصر
فکر کنم شما درست متوجه نشدین ، من اینکاری که شما گفتین را کردم ولی بدتر شد .
چون شما متد رو به صورت استاتيك تعريف كردين يعني به متغيير $this دسترسي نداريد ( همون خط دوازدهي كه تو عكسي كه گذاشتيد به عنوان خط خطا مشخص شده)
شما يا بايد اين متد رو از حالت استاتيك دربياريد ( با حذف كردن كلمه static ) و يا اون راهي رو كه گفتم انجام بدين

حالا اگه كاري رو كه من گفتم رو انجام دادين و خطا داد لطف كنيد متن خطا رو بذاريد شايد مشكل از جاي ديگه اي باشه

redhat2
سه شنبه 17 بهمن 1391, 16:26 عصر
من کدا را این شکلی کردم :


<?php

class Autoloader {

public static $_config = array();

public function __construct() {
self::$_config = new Config();
}

public static function autoload($class) {
$home = self::$_config['path']['path_home'];
$ds = self::$_config['path']['path_directory'];
if (file_exists($home . $ds . self::$_config['path']['path_libs'] . $ds . $class . '.php')) {
require_once $home . $ds . self::$_config['path']['path_libs'] . $ds . $class . '.php';
}
}

}

spl_autoload_register(array('Autoloader', 'autoload'));
?>


و ارور تصویر را داد .

redhat2
سه شنبه 17 بهمن 1391, 17:48 عصر
یعنی واقعا هیچ کس نیست که جواب بده . ؟:متعجب:

AbiriAmir
سه شنبه 17 بهمن 1391, 18:14 عصر
عزیز اینی که گذاشتید ارور نیست...
این ارور رو فقط ومپ میده و در واقع ارور نیست بلکه notice هست
توی سرور این ارور نشون داده نمیشه
همچنین میتونید کاری کنید که نشون داده نشه...
اما راه حلش:
اگر شما به متن notice دقت کنید خودش داره میگه که مشکل از کجاست!
کافیه کدتون رو به صورت زیر عوض کنید:

public static $_config = array( 'path' => '' );

redhat2
سه شنبه 17 بهمن 1391, 19:32 عصر
من کدا را اینطوری کردم : ولی خوب درست نشد .



class Autoloader {

public static $_config = array('path' => '');

public function __construct() {
self::$_config = new Config();
}

public static function autoload($class) {
$home = self::$_config['path']['path_home'];
$ds = self::$_config['path']['path_directory'];
if (file_exists($home . $ds . self::$_config['path']['path_libs'] . $ds . $class . '.php')) {
require_once $home . $ds . self::$_config['path']['path_libs'] . $ds . $class . '.php';
}
}

}

spl_autoload_register(array('Autoloader', 'autoload'));


ولی خوب این ارور را میده :

AbiriAmir
سه شنبه 17 بهمن 1391, 21:03 عصر
اشتب شد
اینو بزنید:


public static $_config = array( 'path' => array( 'path_directory' => '', 'path_home' => '', 'path_libs' => '' ) );

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

redhat2
سه شنبه 17 بهمن 1391, 22:07 عصر
اشتب شد
اینو بزنید:


public static $_config = array( 'path' => array( 'path_directory' => '', 'path_home' => '', 'path_libs' => '' ) );

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

میشه بگید این چیکار میکنه :

Reza1607
چهارشنبه 18 بهمن 1391, 08:30 صبح
دوست عزيز مشكل شما اين كه يكم تو كار با كلاس اشتباه كردين
شما تو تابع سازنده كلاس Config مياين تنظيمات رو برمي گردونيد در صورتي كه توابع سازنده و مخرب در هنگام اجرا به صورت خودكار چيزي رو برنمي گردونند و مشكل شما دقيقا همين جاست (البته من خودم هم اولش دقت نكردم)
حال شما مي تونيد چند كار انجام بدين
ابتدا بياين از كلاس كانفيگتون يك شئي بسازيد و به صورت دستي تابعع سازنده رو صدا بزنيد با كد زير


$obj=new Config();//در اين دستور تابع سازنده اجرا مي شود ولي چيزي به عنوان خروجي برنمي گرداند
self::$_config=$obj->__construct(); //با اين روش تابع سازنده تنظيمات رو برمي گردونه

و يا


class Config{
public static function Settings(){
return array(
'path' => array(
'path_home' => 'http://localhost/mvc',
'path_base' => 'd:/xampp/htdocs/s',
'path_controller' => 'controllers',
'path_model' => 'model',
'path_view' => 'views',
'path_libs' => 'libs',
'path_directory' => DIRECTORY_SEPARATOR
),
'db' => array(
'db_local' => 'localhost',
'db_user' => 'root',
'db_pass' => '',
'db_name' => 'mvc'
)
);
}
}

//و در قسمت خواندن تنظيمات
self::$_config=Config::Settings();