آموزش فراخوانی متدها و property ها به صورت زنجیره ای و پشت سرهم / chaining methods & properties>>
در مبحث حاضر به شرح نحوه ی فراخوانی دستورات به صورت پشت سرهم در php می پردازیم. در این آموزش خواهید دید هنگامی که متد یک کلاس $this را با استفاده از دستور return در انتهای بدنه (تابع) برمی گرداند، چگونه می توان دستورات را به صورت پشت سرهم در یک خط صدا زده و کد اپلیکیشن مورد نظر را به صورت روان و کاراتر نوشت.
برای مثال، در کلاس Car، می خواهیم مقدار بنزین موجود در باک ماشین را اندازه گیری کنیم. مقدار سوخت موجود در باک علاوه بر بنزینی که در باک می ریزیم، به مسافتی که اتومبیل (بر حسب مایل) طی می کند ، بستگی دارد.
به منظور نیل به این هدف، ابتدا یک property با سطح دسترسی public به نام $tank در کلاس car تعریف می کنیم. داخل این متغیر مقدار سوخت (بر حسب گالون) که در باک ماشین ریخته شده است را ذخیره می نماییم.
class Car { public $tank; }
آنچه در این آموزش خواهید آموخت:
- با نحوه ی فراخوانی پشت سرهم متدها و property های کلاس آشنا می شوید.
- علت فراخوانی پشت سرهم متدها و property ها را خواهید فهمید.
لازم است دو متد به کلاس Car اضافه کنیم:
- متد ()fill، به هنگام فراخوانی، باک اتومبیل را با چند گالون سوخت پر می کند.
- متد ()ride به هنگام فراخوانی، محاسبه می کند آیا چقدر سوخت برای طی کردن مسافت معینی مصرف می شود و سپس آن مقدار سوخت را از باک (مقدار متغیر $tank) کسر می کند. در مثال جاری، فرض را بر این می گذاریم که ماشین به ازای هر 50 مایل، 1 گالون سوخت مصرف می کند:
class Car { public $tank; // Add gallons of fuel to the tank when we fill it. public function fill($float) { $this-> tank += $float; } // Substract gallons of fuel from the tank as we ride the car. public function ride($float) { $miles = $float; $gallons = $miles/50; $this-> tank -= $gallons; } }
حال با فراخوانی اعضای کلاس به صورت زنجیره ای و پشت سرهم در یک خط، کد خود را به صورت بهینه سازمان دهی می کنیم. به علمگر پیکان در مثال زیر دقت کنید:
$tank = $car -> fill(10) -> ride(40) -> tank;
شرح کد: پس از پر کردن باک ماشین با 10 گالون و طی کردن 40 مایل، چقدر سوخت در باک ماشین (متغیر tank) باقی می ماند.
برای اینکه بتوانیم متدها را به صورت پشت سرهم یا زنجیره ای فراخوانی کنیم، متدها می بایست آبجکت را به عنوان خروجی بازگردانی کند و از آنجایی که داخل کلاس خود هستیم، متد باید کلیدواژه ی $this را برگرداند. در قطعه کد زیر می بینید که چگونه هر یک از متدها با برگرداندن $this (درج کلیدواژه ی $this پس از دستور return در انتهای بدنه ی هر متد) امکان فراخوانی پشت سرهم دستورها را فراهم می کنند.
Car { public $tank; // Add gallons of fuel to the tank when we fill it. public function fill($float) { $this-> tank += $float; return $this; } // Substract gallons of fuel from the tank as we ride the car. public function ride($float) { $miles = $float; $gallons = $miles/50; $this-> tank -= ($gallons); return $this; } }
اکنون، می توانیم یک آبجکت از روی کلاس Car به نام $bmw ساخته و مقدار سوخت باقی مانده در باک ماشین (مقدار نهایی متغیر tank پس از کسر مسافت طی شده) را پس از افزودن 10 گالون به باک و پیمودن 40 مایل بدست بیاوریم.
// Create a new object from the Car class. $bmw = new Car(); // Add 10 gallons of fuel, then ride 40 miles, // and get the number of gallons in the tank. $tank = $bmw -> fill(10) -> ride(40) -> tank; // Print the results to the screen. echo "The number of gallons left in the tank: " . $tank . " gal.";
خروجی:
The number of gallons left in the tank: 9.2 gal.