PDA

View Full Version : سوال: عدم اجرای کلاس یوزر بصورت خودکار



pejman_view
یک شنبه 01 آبان 1390, 15:07 عصر
سلام

من یک کلاس یوزر نوشتم اما با اینکه می دونم این کد هیچ مشکلی نداره باز ارور می ده
Fatal error: Call to a member function full_name() on a non-object in
از اساتید و دوستان گرامی خیلی ممنون می شم که مرا کمک کنند.

کلاس به شکل ذیل است:



Class User{
public $id;
public $email;
public $password;
public $first_name;
public $last_name;

public static function find_all(){
return self::find_by_sql('SELECT * FROM users');
}

public static function find_by_id($u_id=0){
$r = self::find_by_sql("SELECT * FROM users WHERE user_id={$u_id} LIMIT 1");
return !empty($r) ? array_shift($r) : false;
}

public static function find_by_sql($sql=""){
global $database;
$r = $database->query($sql);
$object_array = array();
while ($row = $database->fetch_array($r)){
$object_array[] = self::instantiate($row);
}
return $object_array;
}

public function full_name(){
if(isset($this->first_name) && isset($this->last_name)){
return $this->first_name." ".$this->last_name;
}else{
return "Error!";
}
}

private static function instantiate($record){
// $user->id = $record['id'];
// $user->email = $record['email'];
// $user->password = $record['pass'];
// $user->first_name = $record['first_name'];
// $user->last_name = $record['last_name'];
$object = new self;
foreach ($record as $attribute=>$value){
if($object->has_attribute($attribute)){
$object->$attribute = $value;
}
}
return $object;
}

private function has_attribute($attribute){
$object_vars = get_object_vars($this);
return array_key_exists($attribute,$object_vars);
}
}

حالا در یک صفحه دیگر این کلاس رو بعلاوه دیگر کلاس ها require_once می کنم. سپس کد زیر رو می نویسم


$user = User::find_by_id(1);
echo $user->full_name();



مطمئنم این کد باید جواب بده اما نمی دونم چرا با این اررور مواجه می شم
Fatal error: Call to a member function full_name() on a non-object in

از اساتید و دوستان محترم خیلی ممنون می شم مرا راهنمایی کنند.

Mr.Moghadam
یک شنبه 01 آبان 1390, 15:36 عصر
باید یه نمونهاز کلاست بسازی که شما نساختی



$user = new User();
echo $user->full_name();

farhadfery
یک شنبه 01 آبان 1390, 15:40 عصر
از اساتید و دوستان محترم خیلی ممنون می شم مرا راهنمایی کنند.
من استاد نیستم. شاگردم. پس اگر اشتباه گفتم بر من ایراد مگیرید:چشمک:
الان user در کد زیر یه آرایه هست نه یک شی! شما سعی دارید از طریق یک آرایه به تابع عضو کلاس دسترسی پیدا کنید! باید شی بسازید

$user = User::find_by_id(1);
echo $user->full_name();

pejman_view
یک شنبه 01 آبان 1390, 16:04 عصر
باید یه نمونهاز کلاست بسازی که شما نساختی



$user = new User();
echo $user->full_name();




من استاد نیستم. شاگردم. پس اگر اشتباه گفتم بر من ایراد مگیرید:چشمک:
الان user در کد زیر یه آرایه هست نه یک شی! شما سعی دارید از طریق یک آرایه به تابع عضو کلاس دسترسی پیدا کنید! باید شی بسازید

$user = User::find_by_id(1);
echo $user->full_name();


و هرکسی به من چیزی بیاموزه تا آخر عمر برای من استاده :چشمک:
آخه منم همین مشکلمه نگاه کنید Kevin Skoglund یکی از استادهای PHP این بحث را مطرح کرد و حتی فایل های خودش هم اجرا میشن اما من دقیقاً عینه خودش کد می زنم این اررور رو به من می ده.

فایل تمرین ایشون را با نام کوین 76956 و خودم را با me براتون ذخیره کردم76957kev

من هنوز اول راه شی گرایی در PHP هستم دارم سعی می کنم که یاد بگیرم.

rezakho
یک شنبه 01 آبان 1390, 23:59 عصر
دوستان
کد اصل درسته
متد User::find_by_id یک متد استاتیک هست که متد find_by_sql را فراخوانی و این متد در نهایت با فراخوانی متد دیگری با نام instantiate یک شی از کلاس User را بر میگردونه که در نهایت فراخوانی
echo $user->full_name باید بدون مشکل اجرا بشه، ولی دوستمون کد اشتباه نوشته.
این کدها از شگردهای پیچیده شی گرایی استفاده کرده، که برای شروع یا حتی نیمه حرفه کار کردن OOP سنگینه!
من که پیشنهاد می کنم روش کار نشه، چون فقط باعث سردرگمی میشه. :)

pejman_view
دوشنبه 02 آبان 1390, 02:31 صبح
سلام

ممنون از راهنماییتون اما بنظرم اگر یکم در این باره توضیح بدید خیلی خیلی بیشتر ممنونت می شم لطفاً بگید مشکل کار من کجاست چون من گام به گام انجام دادم فرض کنید من گام های اولیه رو رفتم اما نمی دونم چطور این گام رو هم بردارم

با تشکر

rezakho
دوشنبه 02 آبان 1390, 22:44 عصر
سلام
آقا پژمان، کد درسته، اشکال کار اینجاست که وقتی متد find_by_sql اجرا میشه، حلقه while داخل این متد سعی می کنه به ازای تعداد کاربران یافت شده با user_id ارسالی، شی از روی کلاس بسازه :

while ($row = $database->fetch_array($result_set)) {
$object_array[] = self::instantiate($row);
}
غافل از اینکه توی صفحه index.php نوشتی
$user = User::find_by_id(1); در صورتی که داخل پایگاه داده پیوست شده، کاربری با user_id برابر 1 نداری :)

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

$user = User::find_by_id(21);
موفق باشی :)

pejman_view
چهارشنبه 04 آبان 1390, 21:49 عصر
سلام
آقا پژمان، کد درسته، اشکال کار اینجاست که وقتی متد find_by_sql اجرا میشه، حلقه while داخل این متد سعی می کنه به ازای تعداد کاربران یافت شده با user_id ارسالی، شی از روی کلاس بسازه :

while ($row = $database->fetch_array($result_set)) {
$object_array[] = self::instantiate($row);
}
غافل از اینکه توی صفحه index.php نوشتی
$user = User::find_by_id(1); در صورتی که داخل پایگاه داده پیوست شده، کاربری با user_id برابر 1 نداری :)

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

$user = User::find_by_id(21);
موفق باشی :)

آقا رضا ممنون بابت راهنماییت جواب داد! حالا یه سوال داشتم حالا راهی می شه پیشنهاد بدید که این ارور رو هندل کنم؟

rezakho
پنج شنبه 05 آبان 1390, 18:21 عصر
سلام
کلاست رو یکم تغییر دادم
خطوط 18 تا 27 و خطوط 38 تا 47 را تغییر دادم
ببین به دردت می خوره؟


// If it's going to need the database, then it's
// probably smart to require it before we start.
require_once('mysql.class.php');

class User {

public $user_id;
public $username;
public $pass;
public $first_name;
public $last_name;

public static function find_all() {
return self::find_by_sql("SELECT * FROM users");
}

public static function find_by_id($id=0) {
//
// Rezakho
//
try{
$result_array = self::find_by_sql("SELECT * FROM users WHERE user_id={$id} LIMIT 1");
}catch(Exception $e){
echo 'Caught exception: ', $e->getMessage(), "\n";
exit;
}
//
return !empty($result_array) ? array_shift($result_array) : false;
}

public static function find_by_sql($sql="") {
global $database;
$result_set = $database->query($sql);
$object_array = array();
while ($row = $database->fetch_array($result_set)) {
$object_array[] = self::instantiate($row);
}
//return $object_array;
//
// Rezakho
//
if(!empty($object_array)){
return $object_array;
}else{
Throw new Exception("کاربری با این شناسه یافت نشد ".__LINE__);
}
//
}

public function full_name() {
if(isset($this->first_name) && isset($this->last_name)) {
return $this->first_name . " " . $this->last_name;
} else {
return "";
}
}

private static function instantiate($record) {
// Could check that $record exists and is an array
$object = new self;
// Simple, long-form approach:
// $object->id = $record['id'];
// $object->username = $record['username'];
// $object->password = $record['password'];
// $object->first_name = $record['first_name'];
// $object->last_name = $record['last_name'];

// More dynamic, short-form approach:
foreach($record as $attribute=>$value){
if($object->has_attribute($attribute)) {
$object->$attribute = $value;
}
}
return $object;
}

private function has_attribute($attribute) {
// get_object_vars returns an associative array with all attributes
// (incl. private ones!) as the keys and their current values as the value
$object_vars = get_object_vars($this);
// We don't care about the value, we just want to know if the key exists
// Will return true or false
return array_key_exists($attribute, $object_vars);
}
}