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