سلام و خسته نباشید به دوستان عزیز
من یک شی از یک کلاس میسازم و میخوام که وقتی اون شی ساخته شده رو در foreach میزارم یه پراپرتی خاصی مثلا به اسم data داخل حلقه قرار بگیره
class User
{
protected $data;
public function get()
{
// $data = query for get all users
$this->data = $data;
}
public function __toString()
{
return $this->toJson();
}
public function toJson()
{
return json_encode($this->data, ۰);
}
public function __debugInfo()
{
return $this->data ? (array)$this->data : [];
}
}
$users (new User())->get();
foreach ($users as $user) {
// any command
}
یعنی در اصل میخوام که اون پراپرتی دیتا رو قرار بده داخل foreach
@ali.bayat
با تشکر فراوان ازتون که من رو خیلی به جواب نزدیک کردید
منظور من دقیقا این بود که ... :
class User implements IteratorAggregate
{
protected $data;
public function get(){
// database query
$this->data = $data;
return $this;
}
public function getIterator()
{
return new ArrayIterator($this->data);
}
}
$model = (new User());
$users = $model->get();
foreach ($users as $user) {
var_dump($user);
}
قسمت های زیر رو ویرایش کنید
public function get()
{
// $data = query for get all users
$this->data = $data;
return $this->data;
}
$users = (new User())->get();
بعد از رفع این ارورهای سینتکسی باز هم کد شما کار نخواهد کرد، چون مقدار data در متد get بدرستی مقدار دهی نشده--> پس users$ برابر Null خواهد بود و چیزی نیست که در حلقه foreach قرار بگیره
@ali.bayat
ممنون از پاسختون اما من میخوام که همچنان خود $this رو به تنهایی برگردونم چون میخوام یک شی از کلاس یوزر ها باشه تا بتونم به طور مثال متد update رو روی هر یوزر صدا بزنم
کاری که لاراول انجام میده
برگردوندن this$ یا در واقع خود Instance کلاس برای مواقعی هست که بخواهید از چند متد به صورت chain استفاده کنید..
برای کاری که میخواهید انجام بدید پیشنهاد میکنم سورس کد ORM لاراول (الکوئنت) رو بررسی کنید.
@ali.bayat
تا اینجایی متوجه هستم که دیتا ها داخل یک پراپرتی در کلاس collection ذخیره میشن و وقتی اون شی ساخته شده رو داخل حلقه میزاریم میره و از پراپرتی که دیتا داخلشه مقدار میگیره
اینکه چطور این کار رو انجام میده برام سواله و لازمش دارم
در کدی که بالاتر به اشتراک گذاشتید، مشکل اصلی این بود که شما data رو مقدار دهی نکردید. و این کار در لاراول به صورت پیچیدهتری انجام میشه تا این که بصورت دستی مقدار دهی بشه.
در سرتاسر لاراول از Contract ها و Magic متد های زیادی استفاده میشه. ممکنه بعضی متد ها رو نتونید به صورت مستقسم پیدا کنید اما اگر بگردید در سورس کد پیداش میکنید
@ali.bayat
مشکل کد بالا رو متوجه شدم
فقط نمیخوام که پراپرتی data رو برگردونم فقط میخوام که $this برگرده تا بتونم کارای بیشتری رو روش انجام بدم
و اینکه داخل حلقه پراپرتی data واکشی بشه
نمونه های استفاده از Collection هارو در لینکهای زیر بررسی کنید
https://www.sitepoint.com/collection-classes-in-php/
https://coderwall.com/p/4inomq/php-collections
@ali.bayat
با تشکر فراوان ازتون که من رو خیلی به جواب نزدیک کردید
منظور من دقیقا این بود که ... :
class User implements IteratorAggregate
{
protected $data;
public function get(){
// database query
$this->data = $data;
return $this;
}
public function getIterator()
{
return new ArrayIterator($this->data);
}
}
$model = (new User());
$users = $model->get();
foreach ($users as $user) {
var_dump($user);
}
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟