• 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
کمک برای درک یک کد
#1
سلام
جدیدا مدتیه دارم شی گرایی رو یاد میگیرم
امروز تویه یه کد به مشکلی برخوردم ممنون میشم یه نفر برام توضیح بده

کد پی‌اچ‌پی:
require_once ("db.php");
class 
User {
    
    public 
$id;
    public 
$username;
    public 
$password;
    public 
$name;
    public 
$lname;
  
  public static function 
find_by_id($id=0) {
    
$result_array self::find_by_sql("SELECT * FROM user WHERE id={$id} LIMIT 1");
        return !empty(
$result_array) ? array_shift($result_array) : false;
  }
  
  public static function 
find_by_sql($sql="") {
    global 
$db;
    
$result_set $db->query($sql);
    
$object_array = array();
    while (
$row $db->fetch_array($result_set)) {
      
$object_array[] = self::instantiate($row);
    }
    return 
$object_array;
  }


    private static function 
instantiate($record) {
        
// Could check that $record exists and is an array
    
$object = new self;
        
        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);
    }
}


$myuser=user::find_by_id(2);
echo 
$myuser->lname

مشکل من مربوط به خطه آخره

echo $myuser->lname;
من متوجه نمیشم چطور myuser میتونه این کارو بکنه مگه نباید اول یه نمونه از رویه کلاس بسازه تا بتونه اینطوری به lname دسترسی داشته باشه
  پاسخ
تشکر شده توسط :
#2
در متد instantiate این قسمت رو در نظر بگیرید:
کد پی‌اچ‌پی:
$object = new self
یک شی از کلاس ساخته می شه

فراخوانی متد instantiate در متد find_by_sql انجام می شه
متد find_by_sql هم در find_by_id فراخوانی شده
  پاسخ
تشکر شده توسط : Heretic
#3
با عرض سلام و خوش آمود گویی به شما دوست عزیز و گرامی
امید وارم مجموعه برنامه های سازمانی این سایت به شما در موفقیت های علمی تون کمک کنه
-------------------------------------------------------------------
کدتون جای سئوال داره:
چرا متد های پابلیک و استاتیک کردین؟
متد find_by_id در نهایت چه چیز هایی از چه انواعی برمی گردونه ؟
این $object = new self; دیگه چرا؟ یعنی راه دیگه ای نبود؟ اصلا از چه الگویی دارید استفاده می کنید؟
علم تاج افتخار دنیا و یادگار پس از مرگ است
  پاسخ
تشکر شده توسط :
#4
ممنون

اینطوری که من متوجه شدم در واقع یک شی برگردونده میشه به myuser نه یک ارایه برایه همین میتونه به این شکل عمل کنه

با تشکر از ادمین عزیز
در مورد سوال اولتون برایه این استاتیک کردم که بتونم بدونه داشتن instance متد رو فراخوانی کنم فکر نمیکنم چندان تفاوتی داشته باشه
متد find_by_id کارش اینه که یه یوزر رو بر اساس id به کمک کلاس db که فعلا تو این صفحه نیست پیدا میکنه و
کد پی‌اچ‌پی:
public $id;
    public 
$username;
    public 
$password;
    public 
$name;
    public 
$lname
رو مقدار دهی میکنه
و سپس یک شی رو بر میگردونه که همه اون ویژگی ها رو داره
(شرمنده رفرنس من انگلیسیه معادل برخی کلمات فارسی رو ممکنه بی ربط گفته باشم )

در مورد سوال سومتون هم میخایم وقتی یوزری با متد find_by_id پیدا شد بتونیم به همه ویژگی اون یوزر که در بالا گفته شد دسترسی داشته باشیم بنابراین شی رو ایجاد کرده و وِیژگی ها رو بر اساس ویژگی های پیدا شده در دیتابیس مقدار دهی میکنیم

در پایان بابا من ننوشتم اینو Tongue یعنی نوشتم ولی بر اساس راهنمایی مرجع وفعلا هرچی اون بگه ما هم انجام میدیم تا بعدا با روش های دیگه آشنا بشم
  پاسخ
تشکر شده توسط :
#5
این درست نیست که شما از یک کلاس تو خودش آبجکت سلف بگیرید و برگردونید.
به جای این کار نی تونید از دوتا کلاس استفاده کنید. یکی یا اینکه خصوسا رو مقدار دهی کنید و بعد ازشون استفاده کنید
استاتیک بودن با نبود خیلی فرق دارن
در مورد اینکه کدوخودتون ننوشتید هم باید بگم به به به به Big Grin
علم تاج افتخار دنیا و یادگار پس از مرگ است
  پاسخ
تشکر شده توسط :
#6
اقا این همه به به زیاده یکمشو فعلا نگهدارید برایه بعدا که بیشتر درخشیدم Wink

اگه ممکنه مشکل این روش رو که تو خودش آبجکت سلف بگیره رو بگید آخه اینطوری ساده تر و خلاصه تره
  پاسخ
تشکر شده توسط :
#7
ابجکت سلف می تونه استک اور فلو داشته باشه . دور داشته باشه و....
توصیه میشه از ازه های استاندارد دیگه استفاده کنید Smile
علم تاج افتخار دنیا و یادگار پس از مرگ است
  پاسخ
تشکر شده توسط : Heretic
#8
یه سوال دیگه چون به همین مربوطه گفتم همینجا بپرسم
من دارم یه فروشگاه رو که قبلا نوشتم با روش شی گرا باز نویسی میکنم
تا حالا برای یوزر و دیتابیس و سشن ها کلاس ساختم
اخرین مسئله که مونده مربوط به کالا هاست

همونطور که تویه نمونه کد بالا گزاشتم یوزر دارایه ویژگی هایی مثل NAME , PASS , ..... هستش برایه همه یوزر ها یکسان مشخص هستن و برای هر یوزر بهشون مقدار میدیم و ازشون استفاده میکنیم
اما کالایی یه سری ویژگی ها داره مثل نام و قیمت و .... که از قبل مشخصا و بین همه مشترکه ولی یه تعداد ویژگی هاش از قبل معلوم نیست وممکنه یه کالا بیشتر از کالای دیگه داشته باشه اونها رو چه باید کرد
البته کاره زیادی باهاشون ندارم فقط برای پرینت و ادیت کردن به اینها نیاز دارم
ولی به هر حال باید اول توی کلاس مقدار دهی بشن تا بعد بشه بلا سرشون اورد
دوستان حرفه ای لطفا راهنمایی کنن معمولا در این مواقع روش کار چجوریه ؟
میشه از نوع آرایه ساخت و ریختشو تو اون ؟
  پاسخ
تشکر شده توسط :
#9
نه فكر نكنم بشه
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان