۱۷ سینا علیزاده
توضیح بیشتر در مورد __call
جامعه پی اچ پی ایجاد شده در ۲۵ اسفند ۱۴۰۱

استاد میشه بفرمایید ما اینجا دقیقا چیکار کردیم.

بخصوص در لاین 18 و 20.

9ef6-Screenshot 2023-03-16 171008.jpg

سلام سینای عزیز

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

و هر متدی روی کلاس بعد ساختن شی صدا زده بشه به این متد پاس داده میشه.

در ابتدا اومدیم حروف غیر از سه حرف اول رو از نام متد گرفتیم و بصورت کپتال در آوردیم.

بعد چک کردیم که در این کلاس چنین متدی وجود داره یا خیر و اگر وجود داشت و سه حرف اول برابر set بود مقدار پراپرتی رو بصورت تریم شده(حذف اسپیس و...) در داخل متغیری با نام property ریختیم.

احمدرضا فاطمی کیا ۲۵ اسفند ۱۴۰۱، ۱۳:۵۶

ممنون استاد.

یه سوال دیگه داشتم خدمتتون:

من سترم کار میکنه اما وقتی گتر رو طبق آموزش تعریف کردم تست فیلد شد

0b84-Screenshot 2023-03-16 173452.jpg


با این خطا:

0585-Screenshot 2023-03-16 173820.jpg

سینا علیزاده ۲۵ اسفند ۱۴۰۱، ۱۴:۰۸

سینای عزیز

یه دامپ از متغیر پراپرتی بگیر ببین مقدارش بعد ست شدن اوکیه؟

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

احمدرضا فاطمی کیا ۲۵ اسفند ۱۴۰۱، ۱۴:۲۵

بفرمایید استاد:

3a23-Screenshot 2023-03-16 180112.jpg


ee25-Screenshot 2023-03-16 180242.jpg

سینا علیزاده ۲۵ اسفند ۱۴۰۱، ۱۴:۳۲

به این شکل هم دامپ کن:

var_dump($this->$property);
احمدرضا فاطمی کیا ۲۵ اسفند ۱۴۰۱، ۱۴:۳۷

8904-Screenshot 2023-03-16 180840.jpg

سینا علیزاده ۲۵ اسفند ۱۴۰۱، ۱۴:۳۸

پس مشکل از شرطه.

خب حالا بعد از ست کردن در لاین بعد get رو صدا و شرط رو از کامنت در بیارید.

یک اسپیس هم بعد از متغیر متد در substr گذاشتید اونم بردارید.

احمدرضا فاطمی کیا ۲۵ اسفند ۱۴۰۱، ۱۴:۴۱

3b60-Screenshot 2023-03-16 180840.jpg


4f9d-Screenshot 2023-03-16 181612.jpg

سینا علیزاده ۲۵ اسفند ۱۴۰۱، ۱۴:۴۷

از تستی که نوشتید هم اسکرین بدید.

احمدرضا فاطمی کیا ۲۵ اسفند ۱۴۰۱، ۱۴:۵۰

بفرمایید استاد:

3a23-Screenshot 2023-03-16 180112.jpg


ee25-Screenshot 2023-03-16 180242.jpg

سینا علیزاده ۲۵ اسفند ۱۴۰۱، ۱۵:۰۰

این خدمت شما:

سینا علیزاده ۲۵ اسفند ۱۴۰۱، ۱۵:۰۱

سلام سینا عزیز

ست کردن رو درست انجام نمیدی و بخاطر همینه.

من تست کردم با این کد عمل کرد:

public function __call(string $name, array $arguments)
{
    $property = substr($name, 3);
    if (strtolower(substr($name, 0, 3)) == 'set') {
        $this->$property = $arguments[0];
    }
    if (strtolower(substr($name, 0, 3)) == 'get') {
        return $this->$property;
    }
}
public function testGetTheFirstName()
{
    $user = new User();
    $user->setFirstName('Sina');
    $this->assertEquals('Sina', $user->GetFirstName());
}
احمدرضا فاطمی کیا ۲۵ اسفند ۱۴۰۱، ۱۶:۵۵

استاد شما کلاس Helpers تون کجاست؟

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

سینا علیزاده ۲۶ اسفند ۱۴۰۱، ۲۳:۱۹

سینا عزیز

بررسی کردم مشکل از شرط بررسی نام متد گت بود که باید اون رو به شکل اسمال تبدیل و بعد بررسی کنی.

if(strtolower(substr($method,0,3)) == 'get'){
                return $this->$property ;
            }
احمدرضا فاطمی کیا ۲۷ اسفند ۱۴۰۱، ۰۵:۰۳

استاد ببخشید خیلی میپرسم.

من دوباره ویدیو رو نگا کردم دیدم کد استاد در قسمت getter از strtolower در شرط استفاده نکرده و کدش هم کار میکنه.

ممنون میشم یه توضیحی بدید منم متوجه بشم.


7858-Screenshot 2023-03-18 131913.jpg

سینا علیزاده ۲۷ اسفند ۱۴۰۱، ۰۹:۵۳

به این دلیل هست که شما حرف g رو بصورت کپتال زدید.

$this->assertEquals('Sina', $user->GetFirstName());

به شکل زیر باید بشه:

$this->assertEquals('Sina', $user->getFirstName());
بهترین پاسخ
احمدرضا فاطمی کیا ۲۷ اسفند ۱۴۰۱، ۱۱:۳۶

استاد خیلی ممنون از زحماتتون????

سینا علیزاده ۲۷ اسفند ۱۴۰۱، ۱۱:۴۲