راکت
حل شده

ایجاد یک public function در یک public function دیگر

20 پاسخ

سلام من بعضی وقت ها دیدم که مثلا یک فانکشن تو یک فانکشن دیگه تو کلاس هست ، برای مثال

$class->fun1()->fun2();

ساخت این به چه صورته ؟

ثبت پرسش جدید

پاسخ‌ها

20
افشار محمودیان
افشار محمودیان
@afsharmahmoodian

تخصص: برنامه نویس

بهترین پاسخ
$class->fun1()->fun2();

به این چیزی که شما بهش برخوردید به فارسی میگن متد های ذنجیره ای و چیز چرتی هم نیست و در جای خودش کاربرد داره .
به این صورت که هر متد از یک کلاس یک کاری رو روی آبجکت انجام میده (مثلا مقدار یک پراپرتی رو تغییر میده) و خودش رو برمیگردونه.
به کد زیر دقت کنید:

class Image{

    protected $image;

    public function crop(){

        //crop $image
        return $this;
    }

    public function resize(){

        //resize $image
        return $this;
    }

    public function filter(){

        //filter $image
        return $this;
    }

    public function get(){

        readfile($image); //masalan
    }

}

حتی ممکنه این فانکشن آبجکتی از نوع خودش برنگردونه و آبجکت دیگه ای رو برگردونه، اگر اونم دارای متد های ذنجیره ای باشه میتونین ازش استفاده کنید .
به کد زیر دقت کنید:
مثلا من میتونم اینطوری استفاده کنم:


$image = new Image();
$image->crop()->resize()->filter()->getSVG()->a()->b()->c()->get();
class Image{

    protected $image;

    public function crop(){

        //crop $image
        return $this;
    }

    public function resize(){

        //resize $image
        return $this;
    }

    public function filter(){

        //filter $image
        return $this;
    }

    public function getSVG(){

        return new SVG($this->image); //masalan
    }

    public function get(){

        readfile($this->image); //masalan
    }

}

class SVG{

    protected $svg;

    public function a(){

        //do something $svg
        return $this;
    }

    public function b(){

        //do something $svg
        return $this;
    }

    public function c(){

        //do something with $svg
        return $this;
    }
    public function get(){

        readfile($this->svg); //masalan
    }

}

Ibo Kiani
Ibo Kiani
@abdoki7788

تخصص: Backend developer

اون احتمالا اینجوریه که فانکشن اول یه آبجکت برمیگردونه که داخلش اون فانکشن دوم هست

ایلیا غلامی
ایلیا غلامی
@IliyaGholami

تخصص: برنامه نویس

@abdolrahman تست کردم ، ولی چیز چرتیه ، خب کاربر میتونی بدون اون هم دسترسی داشته باشه دیگه میاد میزنه

$class->fun2();

شاید پاسخ شما همین‌جا باشد

ایلیا غلامی
ایلیا غلامی
@IliyaGholami

تخصص: برنامه نویس

میخوام وقتی یه شرط true بود یه فانکشن بسازم داخل اون پابلیک فانکشنم

ایلیا غلامی
ایلیا غلامی
@IliyaGholami

تخصص: برنامه نویس

@abdolrahman مگه منظورتون این نیست

public function fun1()
  {
     return $this;
  }
public function fun2()
  {
    echo 'Hello World';
  }
$class->fun1()->fun2()
Ibo Kiani
Ibo Kiani
@abdoki7788

تخصص: Backend developer

نه لزوما
خب هر جور آبجکتی میتونه برگردونه حتما که نباید this باشه

Ibo Kiani
Ibo Kiani
@abdoki7788

تخصص: Backend developer

و توی اون آبجکتی که برمی گردونه فانکشن fun2() هست

ایلیا غلامی
ایلیا غلامی
@IliyaGholami

تخصص: برنامه نویس

Ibo Kiani
Ibo Kiani
@abdoki7788

تخصص: Backend developer

پی اچ پی کار نیستم و نمیتونم مثال بزنم

:)
:)
@ERR

تخصص: اندروید - تازه کار

با سلام .ممکنه یه شی برگشت بده و حتی میتونیم متد اون شی رو بخونیم که دوست عزیز @abdolrahman نیز اشاره کردند.
مثلا:


class testClass {
    var $bar = 'hi';
    public function fun2(){
     return "ok";
  }

}

public function fun1(){
     return new testClass();
  }

 var $ok = fun1()->fun2();
Ibo Kiani
Ibo Kiani
@abdoki7788

تخصص: Backend developer

ایلیا غلامی
ایلیا غلامی
@IliyaGholami

تخصص: برنامه نویس

@afsharmahmoodian سلام ، اخه اونطوری طرف میتونی هر متدی که توی یک کلاس پابلیک هست رو صدا کنه

افشار محمودیان
افشار محمودیان
@afsharmahmoodian

تخصص: برنامه نویس

مشکلش چیه ؟ @ilianazari869

علیرضا کفایتی
علیرضا کفایتی
@alirezakefayati

تخصص: برنامه نویس laravel, vue.js

@abdolrahman
از پاسخ های کوتاه و اسپم بپرهیزید !!!!!!!!
از پاسخ های نا مرتبط به تخصصتون و راهنمایی های نا مناسب بپرهیزید !!!

https://roocket.ir/discuss/%D9%88%DB%8C%DA%98%DA%AF%DB%8C-%D9%87%D8%A7%DB%8C-%D9%BE%D8%A7%D8%B3%D8%AE-%D8%AE%D9%88%D8%A8

ایلیا غلامی
ایلیا غلامی
@IliyaGholami

تخصص: برنامه نویس

مثلا من میخوام طرف تا وقتی که مقادیر رو درست وارد نکرده بود و شرطم true نبود نتونه به فانکشن helloWorld دسترسی داشته باشه

ایلیا غلامی
ایلیا غلامی
@IliyaGholami

تخصص: برنامه نویس

مثلا من میخوام طرف تا وقتی که مقادیر رو درست وارد نکرده بود و شرطم true نبود نتونه به فانکشن helloWorld دسترسی داشته باشه

Ibo Kiani
Ibo Kiani
@abdoki7788

تخصص: Backend developer

:)
:)
@ERR

تخصص: اندروید - تازه کار

@gomnam
به نظرم امکان نظر دادن زیر پست ها را اضاف کنید تا سوالات کوتاه که جواب نیستند را زیر پست بزارن
چون بیشتر سوالاتی که ایشون پرسیدند مرتبط بود
مثلن در stackoverflow
توضیح تصویر رو وارد کنید

:)
:)
@ERR

تخصص: اندروید - تازه کار

@ilianazari869
شما باید داخل فانکشن مقدار سنجی کنید و اگر true بود رو متغییر اعمال شه
مثلن یه متد public به نام setAge در کلاس دارید و یک متغییر private به نام age
باید داخل setAge ورودی این متد را اعتبار سنجی کنید که اگر سن بالاتر از 20 بود به متغییر age مقدار بده
یک متد getAge نیز بسازید که مقدار age برگردونه برای کلاس هایی که میخوان مقدار متغییر age را بگیرند
با این کار تنها متد setAge میتونه به این متغییر مقدار بده (مقداری که خودتون مجاز کردید) و تنها متد getAge میتونه مقدارش رو بخونه

افشار محمودیان
افشار محمودیان
@afsharmahmoodian

تخصص: برنامه نویس

@ilianazari869
دستورات کنترلی مثل شرط ها و حلقه ها ، مربوط به زمان اجرا هستند و نمیشه باهاشون توابع و کلاس ها رو دستکاری کرد .
(البته این تو همه زبان ها صدق نمیکنه ، مثلا vhdl اینطور نیست).
شما باید کاری رو که میخواهید تو کد خودتون هندل کنید.
مثلا اگر شرط برقرار بود کاری که میخواهید انجام بشه و true برگردونه ، اگر نبود false برگردونه.
یا میتونید از کلاس های کمکی و اینترفیس ها کمک بگیرید که برای این کار مناسبه .

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام