جهت ارائه ی اطلاعات شناسنامه ای یک فرد ، نیاز داریم آرایه ای به شکل زیر داشته باشیم :
$person = [
'firstName' => 'Soobaasaa',
'lastName' => 'Ozaaraa',
'age' => 17,
'father' => [
'firstName' => 'Esaaro',
'lastName' => 'Ozaaraa',
'age' => 42
]
];
اما برای جلوگیری از نفوذ اطلاعات غلط به سیستم (مثلا کمتر بودن سن پدر از فرزند ، یا یکی نبودن نام خانوادگی پدر و فرزند) از ما خواسته شده که دو کلاس به نام های Person و Father را به شکلی طراحی کنیم که به صورت زیر قابل استفاده باشند :
$father = Father::firstName('Esaaro')->lastName('Ozaaraa')->age(42);
Person::firstName("Soobaasaa")->lastName( "Ozaaraa")->age(17)
->setFather( $father )-> toArray();
// will output:
[
'firstName' => 'Soobaasaa',
'lastName' => 'Ozaaraa',
'age' => 17,
'father' => [
'firstName' => 'Esaaro',
'lastName' => 'Ozaaraa',
'age' => 42,
],
];
جزئیات
شروطی که برای مشخصات پدر و فرزند مد نظر است عبارت اند از :
-
نام و نام خانوادگی باید از جنس string و حداقل 3 و حداکثر 15 حرف باشد و شامل کاراکترهای عددی نباشد. مثلا : 'kaakero12'قابل قبول نیست
-
سن فرزند باید از جنس int و از 1 تا 130 باشد. (مثلا عدد 0 یا 131 به عنوان مقدار ورودی متد age قابل قبول نیست.)
-
سن پدر حداقل باید 18 و حداکثر 130 سال باشد. (مثلا عدد 17 یا 131 به عنوان مقدار ورودی متد age قابل قبول نیست.)
-
مقدار ورودی به متد setFatherباید یک objectاز کلاسFather باشد.
-
سن پدر و فرزند باید حداقل 18 سال تفاوت داشته باشد.
-
دقت کنید که سن پدر و فرزند هر دو باید معین باشد( فرزندی که سن نداشته باشد نمیتواند پدر داشته باشد و بلعکس)
-
نام خانوادگی lastName پدر و فرزند باید معین و یکسان باشند.
نکات
ویژگی های کلاس های فوق :
-
متد firstName به عنوان اولین متد به صورت static و متد toArray به عنوان آخرین متد صدا زده می شوند و ترتیب صدا زدن بقیه متد ها اهمیتی ندارد.
-
اگر مقادیر ورودی به متد ها با شرط های بالا هم خوانی نداشتند از آن ها کاملا صرف نظر می شود و نباید باعث ایجاد هر گونه ارور شوند.
-
هر دو کلاس باید متدی به نام toArray داشته باشند که با صدا زدن آن در آخر، بتوان آرایه ای شامل اطلاعات فرد را به دست آورد.
$f = Father::firstName('Esaaro')->lastName()->age(22) ->toArray();
// Will output :
[ 'firstName' => 'Esaaro' , 'age' => 22, ]
- صدا زدن متد ها بدون مقدار ورودی نباید تاثیری در مقدار خروجی داشته باشد یا به هر ترتیب باعث ایجاد ارور شود.
->lasName() // Does not cause any php errors.
- برای سادگی کار فرض کنید هیچ گاه متدها را بیش از یک بار صدا نمی زنیم
->lasName('foo')->lastName('Bar') // never happens
$f = Father::firstName('Esaaro')->lastName('Ozaaraa')->age(17)-> toArray();
// Will output :
[ 'firstName' => 'Esaaro', 'lastName' => 'Ozaaraa' ]
چون حداقل سن پدر باید 18 باشد مقدارage در خروجی مشاهده نمی شود.
$f = Father::firstName('Esaaro')->lastName('222')->age(40)-> toArray();
// Will output :
[ 'firstName' => 'Esaaro', 'age' => 40 ],
چون نام خانوادگی نباید شامل عدد باشد مقدار lastName در خروجی مشاهده نمی شود.
$fatherObj = Father::firstName('Esaaro') -> lastName('Ozaaraa') -> age(22);
Person::firstName('Soobaasaa') -> lastName('Ozaaraa') -> age(20) -> setFather( $fatherObj ) -> toArray();
// Will output :
[ 'firstName' => 'Soobaasaa' , 'lastName' => 'Ozaaraa', 'age' => 20, ]
در این مورد چون تفاوت سن پدر و پسر کمتر از 18 سال بوده پارامتر father در خروجی مشاهده نمی شود.
آنچه باید آپلود کنید:
یک فایل Zip شامل یک فایل به نام solution.php
که کلاسهای Father
و Person
در آن قرار دارد.
یعنی هر دو کلاس داخل یک فایل تعریف شوند.
استفاده از trait ها در صورت مجاز و بلامانع است
برای شروع کار میتوانید از لینک زیر یک فایل اولیه را دانلود کنید.
ارسال پاسخ برای این سؤال