جهت ارائه ی اطلاعات شناسنامه ای یک فرد ، نیاز داریم آرایه ای به شکل زیر داشته باشیم :
```php
$person = [
'firstName' => 'Soobaasaa',
'lastName' => 'Ozaaraa',
'age' => 17,
'father' => [
'firstName' => 'Esaaro',
'lastName' => 'Ozaaraa',
'age' => 42
]
];
```
اما برای جلوگیری از نفوذ اطلاعات غلط به سیستم (مثلا کمتر بودن سن پدر از فرزند ، یا یکی نبودن نام خانوادگی پدر و فرزند) از ما خواسته شده که دو کلاس به نام های Person و Father را به شکلی طراحی کنیم که به صورت زیر قابل استفاده باشند :
```php
$father = Father::firstName('Esaaro')->lastName('Ozaaraa')->age(42);
Person::firstName("Soobaasaa")->lastName( "Ozaaraa")->age(17)
->setFather( $father )-> toArray();
```
```php
// 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 داشته باشند که با صدا زدن آن در آخر، بتوان آرایه ای شامل اطلاعات فرد را به دست آورد.
```php
$f = Father::firstName('Esaaro')->lastName()->age(22) ->toArray();
// Will output :
[ 'firstName' => 'Esaaro' , 'age' => 22, ]
```
+ صدا زدن متد ها بدون مقدار ورودی نباید تاثیری در مقدار خروجی داشته باشد یا به هر ترتیب باعث ایجاد ارور شود.
```php
->lasName() // Does not cause any php errors.
```
+ برای سادگی کار فرض کنید هیچ گاه متدها را بیش از یک بار صدا نمی زنیم
```php
->lasName('foo')->lastName('Bar') // never happens
```
***
```php
$f = Father::firstName('Esaaro')->lastName('Ozaaraa')->age(17)-> toArray();
// Will output :
[ 'firstName' => 'Esaaro', 'lastName' => 'Ozaaraa' ]
```
چون حداقل سن پدر باید 18 باشد مقدارage در خروجی مشاهده نمی شود.
***
```php
$f = Father::firstName('Esaaro')->lastName('222')->age(40)-> toArray();
// Will output :
[ 'firstName' => 'Esaaro', 'age' => 40 ],
```
چون نام خانوادگی نباید شامل عدد باشد مقدار lastName در خروجی مشاهده نمی شود.
***
```php
$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 ها در صورت مجاز و بلامانع است
## برای شروع کار میتوانید از لینک زیر یک فایل اولیه را دانلود کنید.
[solution.php](http://bayanbox.ir/info/576322194781329658/solution)