علت استفاده از Return $this

پرسیده شده
فعالیت 915 روز پیش
دیده شده 367 بار
0

سلام به استاد عزیز . 

 

سرچ کردم درموردش و فهمیدم بهش میگن fluent interface .

سوال مهمم اولی هست ولی اگر وقت داشتین بقیه رو جواب بدین ممنون میشم .

 

1 - سوالی که برام پیش اومد اینه که بخاطر تست پذیر بودن این شکلی به دیتابیس متصل شدیم درسته ؟ 

چون راحترش میشد توی کانستراکتور ، هم به دیتابیس متصل شد هم پراپرتی connection رو return کرد . درست متوجه شدم ؟’’’

 

2 -  چه جاهای دیگه از return $this استفاده میشه ؟ 

 

3 - سوال بعدیم اینه وقتی توی متدی ازش استفاده میشه متد های بعدش رو فقط میشه ازش کال کرد یا متد های قبلش هم میشه ؟ 

فایل پیوست

هادی قاسمی
هادی قاسمی

5 آبان 00

0
حذف شده

سلام و احترام

 

۱ - ما باید بتونیم رفتار کلاس رو مشخص کنیم و بدونیم که اون کلاس داره چی کار میکنه، برای مثال همینجا که ما شی از کلاس میسازیم و متد connect رو صدا میزنیم میدونیم الان به دیتابیس متصل شده اما اگه ما همونجا داخل contrcutor بیایم اینکار رو انجام بدیم شاید برامون واضح نباشه که الان دقیقا چه اتفاقی افتاده،‌ و در بعضی از موارد شاید ما بخوهیم اصلا زمانی که از کلاس یه آبجکت میسازیم connectionی صورت نگیره و وقتی متد connect رو صدا زدیم به دیتابیس متصل بشیم

 

 

۲ - زمانی از return $this استفاده میکنیم که بخوایم که به شکل زنجیر وار متدهای یک کلاس رو صدا بزنیم، مثل

Flight::where('active', 1)
      ->where('destination', 'San Diego')
      ->update(['delayed' => 1]);

3 - اگه منطورتون همین return $this هستش میتونید متدهای مختلف رو صدا بزنید و استفاده کنید، البته باید حواستون به متد های static هم باشه

فایل پیوست

امیر صالحی

توسط

امیر صالحی

6 آبان 00

0
حذف شده

سلام.

داخل کانستراکتور هیچ مقدار و type ای رو نمیتونید return کنید.

یعنی return رو هم بنویسید بازهم چیزی return نمیشه.

این مثالو ببینید:

<?php 
class Connector {
    public $connection;
    public function __construct() {
        $servername = "localhost";
        $dbname = "";
        $username = "root";
        $password = "";

        try {
          $conn = $this->connection = $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
          $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch(PDOException $e) {
            var_dump($e);
        }

        return $conn;
    }
}



$cn = new Connector();
var_dump($cn instanceof Connector); // true
var_dump($cn instanceof PDO); // false
var_dump($cn->connection instanceof PDO); // true

 

برای کدنویسی میشه از پروژه های استاندارد الگو گرفت و باید آن چیزی که مرسوم هست رو در ساختار پروژه هامون استفاده کنیم. مثلا متد کانکت لاراول به شکل زیر است:

protected function createPdoConnection($dsn, $username, $password, $options)
{
    if (class_exists(PDOConnection::class) && ! $this->isPersistentConnection($options)) {
        return new PDOConnection($dsn, $username, $password, $options);
    }

    return new PDO($dsn, $username, $password, $options);
}

 این متد، در متد پابلیک createConnection کلاس Connector فراخوانی شده و کلاس Connector بعنوان والد کلاس های دیگر مثل SQLiteConnector یا MySqlConnector و . . . میباشد:

class MySqlConnector extends Connector implements ConnectorInterface

در کلاس MysqlConnector متدی به اسم connect وجود دارد که داخلش createConnection فراخونی شده:

$connection = $this->createConnection($dsn, $config, $options);

 

در فریمورک yii۲ از کانستراکتور کلاس Connection بعنوان ست کردن مقادیر اولیه و با متد open کانکت صورت میگیرد:

$connection = new \yii\db\Connection([
   'dsn' => $dsn,
   'username' => $username,
   'password' => $password,
]);
$connection->open(); 

اون ساختار شما که در کانستراکتور کانکت انجام شود رو هم میشه پیاده کرد و تست هم میشه نوشت. مثلا از متدهای دیگه برای دسترسی به پراپرتی کانکشن استفاده کرد. ولی این روش مرسوم نیست.

فایل پیوست

محسن موحد

توسط

محسن موحد

7 آبان 00