شناسنامه‌ساز


جهت ارائه ی اطلاعات شناسنامه ای یک فرد ، نیاز داریم آرایه ای به شکل زیر داشته باشیم :


$person = [
    'firstName' => 'Soobaasaa',
    'lastName' => 'Ozaaraa',
    'age' => 17,
    'father' => [
        'firstName' => 'Esaaro',
        'lastName' => 'Ozaaraa',
        'age' => 42
    ]
];
PHP

اما برای جلوگیری از نفوذ اطلاعات غلط به سیستم (مثلا کمتر بودن سن پدر از فرزند ، یا یکی نبودن نام خانوادگی پدر و فرزند) از ما خواسته شده که دو کلاس به نام های Person و Father را به شکلی طراحی کنیم که به صورت زیر قابل استفاده باشند :

$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,
    ],
];
PHP

جزئیات🔗

شروطی که برای مشخصات پدر و فرزند مد نظر است عبارت اند از :

  • نام و نام خانوادگی باید از جنس 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,  ]
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' ]
PHP

چون حداقل سن پدر باید 18 باشد مقدارage در خروجی مشاهده نمی شود.


$f  = Father::firstName('Esaaro')->lastName('222')->age(40)-> toArray();

// Will output :   
[ 'firstName' => 'Esaaro', 'age' => 40 ],
PHP

چون نام خانوادگی نباید شامل عدد باشد مقدار 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,  ]
PHP

در این مورد چون تفاوت سن پدر و پسر کمتر از 18 سال بوده پارامتر father در خروجی مشاهده نمی شود.


آنچه باید آپلود کنید:🔗

یک فایل Zip شامل یک فایل به نام solution.php که کلاس‌های Father و Person در آن قرار دارد.

یعنی هر دو کلاس داخل یک فایل تعریف شوند.

استفاده از trait ها در صورت مجاز و بلامانع است

برای شروع کار میتوانید از لینک زیر یک فایل اولیه را دانلود کنید.🔗

solution.php