PDA

View Full Version : مشکل با تابع Autoload



saeed_htb
جمعه 21 مهر 1391, 16:58 عصر
دوستان من با یه مشکل autoload کردن کلاس هام مواجه شدم میشه کمک کنید
یک فایل دارم که تنظیمات اولیه رو توی اون قرار دادم و حاوی کدهای زیر هست
includes/init.inc.php

<?php
session_start();
require_once 'general.inc.php';
define("DEBUG","");
//------------------------------------------------------------------------------
mysql_connect("localhost", "root", "");
mysql_select_db("shop-prj");
mysql_query("SET NAMES 'utf8'");
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
require_once __DIR__ . '/../Smarty/Smarty.class.php';
$smarty = new Smarty;
$smarty->left_delimiter = "{{";
$smarty->right_delimiter = "}}";
$smarty->template_dir = __DIR__ .'/../templates/';
$smarty->compile_dir = __DIR__ . '/../Smarty/templates_c/';
$smarty->force_compile = TRUE;
//------------------------------------------------------------------------------
function __autoload($classname){
require_once "/class/$classname.class.php";
}
و توی صفحه ثبت نامم کلاس user رو صدا زدم
register.php


$user = new user();
$id = $user->addUser($fname, $lname, $email, $pass, $tel, $mobile, $address, $postal);

کلاس user هم توی یه زیر شاخه کنار فایل init.inc.php به آدرس class/user.class.php قرار داره
includes/class/user.class.php


<?php

class user {

function addUser($fname, $lname, $email, $pass, $tel, $mobile, $address, $postal) {
$fname = mysql_real_escape_string($fname);
$lname = mysql_real_escape_string($lname);
$email = mysql_real_escape_string($email);
$pass = mysql_real_escape_string($pass);
$tel = mysql_real_escape_string($tel);
$mobile = mysql_real_escape_string($mobile);
$address = mysql_real_escape_string($address);
$postal = mysql_real_escape_string($postal);
$query = "insert into users set fname='$fname',lname='$lname',email='$email',pass= '$pass',tel='$tel',address='$address',postal='$pos tal',admin=0,emailVer=0";
$res = mysql_query($query);
if (defined("DEBUG") && $res == FALSE) {
echo mysql_errno() . "<br />";
echo $query . "<br />";
echo mysql_error() . "<br />";
}
return $id = mysql_insert_id();
}

}

ولی موقع اجرا با پیغام خطای زیر روبرو می شم.


Fatal error: Class 'user' not found in C:\xampp\htdocs\shop\register.php on line 19
کسی می دونه چرا کلاس ها اتوماتیک لود نمیشن؟

azowghi
جمعه 21 مهر 1391, 18:24 عصر
سلام معلومه خب
شما باید فایل حاوی کلاس رو include کنید




__autoload('user');
$user = new user();
$id = $user->addUser($fname, $lname, $email, $pass, $tel, $mobile, $address, $postal);

azowghi
جمعه 21 مهر 1391, 18:27 عصر
ضمنا




require_once "/class/$classname.class.php";


آدرس دهی غلطه احتمالا

saeed_htb
جمعه 21 مهر 1391, 18:51 عصر
سلام معلومه خب
شما باید فایل حاوی کلاس رو include کنید




__autoload('user');
$user = new user();
$id = $user->addUser($fname, $lname, $email, $pass, $tel, $mobile, $address, $postal);


سلام دوست عزیز منظور شما رو متوجه نمی شم، من از __Autoload استفاده کردم که اتوماتیک کلاس هایی که صدا زده می شن رو لود کنه.
نیازی به صدا زدن اون ندارم دیگه. آخه من توی فایل ثبت نام فایل init.inc.php رو فراخونی کردم و توی اون فایل هم تابع __Autoload رو قرار دادم

ضمنا




require_once "/class/$classname.class.php";


آدرس دهی غلطه احتمالا
نه آدرس دهی درسته، چون echo کردم و درست بود ولی مشکل اینجاست که اصلا تابع autoload فراخونی نمی شه

azowghi
جمعه 21 مهر 1391, 19:19 عصر
این کد رو اجرا کردید ارور نداد؟


require_once "/class/user.class.php";

azowghi
جمعه 21 مهر 1391, 19:21 عصر
این کد رو استفاده کنید ببینید اصلا اجرا میشه:





function __autoload($class_name) {
if(file_exists("/class/".$class_name . '.class.php')) {
require_once "/class/$classname.class.php";

} else {
echo "Unable to load" .$class_name;
}
}

saeed_htb
جمعه 21 مهر 1391, 20:20 عصر
این کد رو استفاده کنید ببینید اصلا اجرا میشه:





function __autoload($class_name) {
if(file_exists("/class/".$class_name . '.class.php')) {
require_once "/class/$class_name.class.php";

} else {
echo "Unable to load" .$class_name;
}
}


دوست عزیز تشکر، امتحان کردم کلا وارد تابع نمیشه. و پیغام خطای زیر رو میده


Fatal error: Class 'user' not found in C:\xampp\htdocs\shop\register.php on line 19

saeed_htb
جمعه 21 مهر 1391, 20:21 عصر
راستی ورژن پی اچ پی که من استفاده می کنم 5.4.0 هست و __autoload رو ساپورت می کنه

MMSHFE
جمعه 21 مهر 1391, 21:16 عصر
دوست عزیز، شما توی فایل register.php فایل init.inc.php رو ضمیمه نکردین. بنابراین کد AutoLoad دیده نمیشه. یا این فایل رو ابتدای register.php با require_once ضمیمه کنید و یا اینکه کد تابع AutoLoad رو توی همون فایل register.php بنویسید.
موفق باشید.

saeed_htb
جمعه 21 مهر 1391, 21:58 عصر
دوست عزیز، شما توی فایل register.php فایل init.inc.php رو ضمیمه نکردین. بنابراین کد AutoLoad دیده نمیشه. یا این فایل رو ابتدای register.php با require_once ضمیمه کنید و یا اینکه کد تابع AutoLoad رو توی همون فایل register.php بنویسید.
موفق باشید.
دوست عزیز تشکر از توجه شما، ولی من این فایل رو توی register.php ضمیمه کردم و در اینجا برای اختصار نویسی فقط دو خط کد از صفحه register.php رو گذاشتم.
تابع autoload رو در صفحه register.php هم امتحان کردم و بازم جواب نگرفتم. همه چیز رو کاملا استاندارد انجام دادم ولی نمی دونم چرا جواب نمی گیرم

MMSHFE
شنبه 22 مهر 1391, 19:08 عصر
این راه رو امتحان کنید:
1- توی فایل includes/init.inc.php این کد رو بنویسید:

if(!defined('ROOT')) { define('ROOT', preg_replace('#\\\\#', '/', dirname(dirname(__FILE__)))); }
2- تابع autoload رو اینطوری بنویسید:


function __autoload($class_name) {
if(file_exists(ROOT . '/class/' . $class_name . '.class.php')) {
require_once ROOT . '/class/' . $class_name . '.class.php';
}
else {
echo 'Unable to load' . $class_name;
}
}

امیدوارم مشکل برطرف بشه.

saeed_htb
سه شنبه 25 مهر 1391, 17:26 عصر
این راه رو امتحان کنید:
1- توی فایل includes/init.inc.php این کد رو بنویسید:

if(!defined('ROOT')) { define('ROOT', preg_replace('#\\\\#', '/', dirname(dirname(__FILE__)))); }
2- تابع autoload رو اینطوری بنویسید:


function __autoload($class_name) {
if(file_exists(ROOT . '/class/' . $class_name . '.class.php')) {
require_once ROOT . '/class/' . $class_name . '.class.php';
}
else {
echo 'Unable to load' . $class_name;
}
}

امیدوارم مشکل برطرف بشه.
دوست عزیز با تشکر از شما این روش هم کار نکرد، نمی دونم چرا ولی کلا تابع __autoload شناسایی نمیشه
به همین دلیل من از تابع
spl_autoload_register استفاده کردم و یک تابع رو به عنوان تابع بارگذاری اتوماتیک نعریف کردم و مشکل حل شد

MMSHFE
چهارشنبه 26 مهر 1391, 21:13 عصر
دوست عزیز روشی که گفتم کار میکنه. فقط یک اشکال کوچک داره. AutoLoad رو اینطوری بنویسید:


function __autoload($class_name) {
if(file_exists(ROOT . '/includes/class/' . $class_name . '.class.php')) {
require_once ROOT . '/includes/class/' . $class_name . '.class.php';
}
else {
echo 'Unable to load' . $class_name;
}
}

پوشه includes یادم رفته بود! :چشمک:

saeed_htb
چهارشنبه 26 مهر 1391, 21:48 عصر
دوست عزیز با تشکر از شما این روش شما هم تست شد اصلا بحث مسیردهی نیست چون من وقتی یک اکوی ساده هم توی تابع __autoload قرار می دم اجرا نمیشه
برام خیلی جالب بود چون روی سیستم یکی از دوستان جواب داد البته اونجا ورژن پی اچ پی 5.3.8 بود و ورژن پی اچ پی من 5.4.0 بود.
وقتی از اون تابع استفاده کردم جواب داد
با تشکر از پیگیری های شما