امتحان PHP 5: البرمجة كائنية التوجه وقواعد البيانات (10 تمارين مركبة)
امتحان PHP 5: البرمجة كائنية التوجه (OOP)
اختبر مهاراتك في بناء برمجيات قوية وقابلة للتوسع باستخدام مفاهيم OOP والتعامل مع قواعد البيانات.
تمرين 1
الفئات والكائنات (Classes & Objects)
أنشئ فئة بسيطة:
- عرف فئة `Fruit` تحتوي على خاصيتين `$name` و `$color`.
- أضف دالة `set_name($name)` لتعيين الاسم.
- أضف دالة `get_name()` لإرجاع الاسم.
- أنشئ كائناً من الفئة، عين اسمه "Apple"، واطبعه.
الحل
<?php
class Fruit {
public $name;
public $color;
function set_name($name) {
$this->name = $name;
}
function get_name() {
return $this->name;
}
}
$apple = new Fruit();
$apple->set_name('Apple');
echo $apple->get_name();
?>
تمرين 2
المُنشئ (Constructor)
استخدم دالة البناء:
- أعد كتابة فئة `Fruit` لتستخدم `__construct($name, $color)`.
- يجب أن يعين المنشئ الخصائص عند إنشاء الكائن.
- أضف دالة `get_color()`.
- أنشئ كائناً "Apple" لونه "Red" واطبع اسمه ولونه.
الحل
<?php
class Fruit {
public $name;
public $color;
function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}
function get_name() {
return $this->name;
}
function get_color() {
return $this->color;
}
}
$apple = new Fruit("Apple", "Red");
echo $apple->get_name();
echo "<br>";
echo $apple->get_color();
?>
تمرين 3
الوراثة (Inheritance)
ورّث الخصائص لفئة أخرى:
- أنشئ فئة `Strawberry` ترث من `Fruit`.
- أضف دالة جديدة `message()` تطبع "Am I a fruit or a berry?".
- أنشئ كائناً من `Strawberry` واستدعِ دوال الفئة الأب والابن.
الحل
<?php
class Strawberry extends Fruit {
public function message() {
echo "Am I a fruit or a berry? ";
}
}
$strawberry = new Strawberry("Strawberry", "Red");
$strawberry->message();
echo $strawberry->get_name();
?>
تمرين 4
معدلات الوصول (Access Modifiers)
تحكم في الوصول للخصائص:
- في فئة `Fruit`، اجعل `$name` عاماً (`public`).
- اجعل `$color` محمياً (`protected`).
- اجعل `$weight` خاصاً (`private`).
- حاول الوصول لكل خاصية من خارج الفئة واشرح النتيجة في تعليق.
الحل
<?php
class Fruit {
public $name;
protected $color;
private $weight;
}
$mango = new Fruit();
$mango->name = 'Mango'; // OK
// $mango->color = 'Yellow'; // ERROR
// $mango->weight = '300'; // ERROR
?>
تمرين 5
الثوابت في الفئات (Class Constants)
استخدم الثوابت داخل الفئة:
- عرف ثابتاً `LEAVING_MESSAGE` داخل فئة `Goodbye`.
- قيمته "Thank you for visiting W3Schools.com!".
- اطبع الثابت باستخدام اسم الفئة وعامل `::` (Scope Resolution Operator).
الحل
<?php
class Goodbye {
const LEAVING_MESSAGE = "Thank you for visiting W3Schools.com!";
}
echo Goodbye::LEAVING_MESSAGE;
?>
تمرين 6
الفئات المجردة (Abstract Classes)
أنشئ هيكلاً عاماً:
- عرف فئة مجردة `Car` تحتوي على دالة مجردة `intro()`.
- أنشئ فئات `Audi` و `Volvo` ترث من `Car`.
- نفذ دالة `intro()` في كل فئة فرعية لتطبع رسالة مختلفة.
الحل
<?php
abstract class Car {
public $name;
public function __construct($name) {
$this->name = $name;
}
abstract public function intro() : string;
}
class Audi extends Car {
public function intro() : string {
return "Choose German quality! I'm an $this->name!";
}
}
class Volvo extends Car {
public function intro() : string {
return "Proud to be Swedish! I'm a $this->name!";
}
}
$audi = new Audi("Audi");
echo $audi->intro();
?>
تمرين 7
الواجهات (Interfaces)
عرف عقداً يجب تنفيذه:
- عرف واجهة `Animal` تحتوي على دالة `makeSound()`.
- أنشئ فئة `Cat` تنفذ الواجهة وتطبع "Meow".
- أنشئ فئة `Dog` تنفذ الواجهة وتطبع "Bark".
الحل
<?php
interface Animal {
public function makeSound();
}
class Cat implements Animal {
public function makeSound() {
echo "Meow";
}
}
class Dog implements Animal {
public function makeSound() {
echo "Bark";
}
}
$cat = new Cat();
$cat->makeSound();
?>
تمرين 8
السمات (Traits)
أعد استخدام الكود:
- عرف سمة `message1` تحتوي على دالة `msg1` تطبع "OOP is fun!".
- استخدم هذه السمة داخل فئة `Welcome`.
- أنشئ كائناً من `Welcome` واستدعِ `msg1`.
الحل
<?php
trait message1 {
public function msg1() {
echo "OOP is fun! ";
}
}
class Welcome {
use message1;
}
$obj = new Welcome();
$obj->msg1();
?>
تمرين 9
الاتصال بقاعدة البيانات (MySQLi Connect)
اتصل بقاعدة بيانات MySQL:
- استخدم `new mysqli` للاتصال بـ `localhost`، المستخدم `username`، كلمة المرور `password`.
- تحقق من الاتصال، إذا فشل اطبع رسالة الخطأ (`connect_error`).
- إذا نجح اطبع "Connected successfully".
الحل
<?php
$servername = "localhost";
$username = "username";
$password = "password";
// Create connection
$conn = new mysqli($servername, $username, $password);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
?>
تمرين 10
الاستعلام من قاعدة البيانات (Select Data)
اجلب بيانات واعرضها:
- اكتب استعلام SQL لاختيار `id`, `firstname`, `lastname` من جدول `MyGuests`.
- نفذ الاستعلام واحصل على النتيجة.
- استخدم حلقة `while` لعرض كل صف من البيانات.
الحل
<?php
$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
}
} else {
echo "0 results";
}
$conn->close();
?>