جهت ارائه ی اطلاعات شناسنامه ای یک فرد ، نیاز داریم آرایه ای به شکل زیر داشته باشیم :
$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 ها در صورت مجاز و بلامانع است
برای شروع کار میتوانید از لینک زیر یک فایل اولیه را دانلود کنید.
ارسال پاسخ برای این سؤال