English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في هذا الدليل، ستتعلم كيفية كتابة البرمجيات بشكل متجه في بايثون.
البرمجة المتجهة (OOP) هي نموذج برمجة يعتمد على مفهوم الفئات والكائنات. على عكس البرمجة بالعملية، حيث يركز العملية على كتابة العمليات أو الوظائف التي تنفذ على البيانات، يركز البرمجة المتجهة على إنشاء كائنات تحتوي على بيانات وفواصل.
لدي البرمجة المتجهة عدة مزايا مقارنة بالبرمجة التقليدية أو البرمجة بالعملية.
يقدم هيكلًا واضحًا للبرنامج.
يستطيع أن يساعدك في اتباع مبدأ "لا تكرر نفسك" (DRY)، مما يجعل شفافية برمجتك أكثر سهولة في الصيانة، التعديل والتحقق.
它使得可以用更少的代码,更短的开发时间和高度的可重用性来创建更复杂的行为。
以下各节将描述类和对象在PHP中的工作方式。
提示:以过程编程风格编写的程序,意味着程序由一个或多个过程组成。而过程是一组一起执行特定任务的编程语句。
提示:“不重复自己”(Don‘t Repeat Yourself,DRY)原则背后的思想是,通过抽象出应用程序常用的代码并将它们放在单个位置并重用它们而不是重复它们,从而减少代码的重复。
类和对象是面向对象编程的两个主要方面。类是独立的变量和函数集合,它们协同工作以执行一个或多个特定任务,而对象是类的单个实例。
一个类充当模板或蓝图,可以从中创建许多单个对象。创建单个对象时,尽管每个对象的某些属性可能具有不同的值,但它们继承相同的通用属性和行为。
例如,将类视为房子的蓝图。蓝图本身不是房屋,而是房屋的详细计划。而对象就像是根据该蓝图建造的实际房屋。我们可以根据相同的蓝图建造几座相同的房屋,但是每座房屋内部可能具有不同的涂料,内饰和家庭,如下图所示。
可以使用class关键字声明一个类,后跟该类的名称和一对花括号({}),如以下示例所示。
让我们创建一个名为Recangle.php的PHP文件,并将以下示例代码放入其中,以便将我们的类代码与程序的其余部分分开。然后,我们只需包含Recangle.php文件,就可以在需要的任何地方使用它。
<?php class Rectangle { //声明属性 public $length = 0; public $width = 0; // طريقة لحساب المحيط public function getPerimeter() { return (2 * ($this->length + $this->width)); } // طريقة لحساب المساحة public function getArea() { return ($this->length * $this->width); } } ?>
public关键字在上面的实例中的属性和方法之前,是一个访问修饰符,表示该属性或方法是可以从任何地方访问。我们将在本章稍后了解更多有关此内容的信息。
ملاحظة:从语法上讲,类中的变量称为属性,而函数称为方法。此外,类名通常是用PascalCase(帕斯卡命名法)编写的,也就是说,每个连接的单词都以大写字母开头(例如,MyClass)。
创建另一个PHP文件名test.php,并将以下代码放入其中。
<?php // تعريف الفئة class Rectangle { //声明属性 public $length = 0; public $width = 0; // طريقة لحساب المحيط public function getPerimeter() { return (2 * ($this->length + $this->width)); } // طريقة لحساب المساحة public function getArea() { return ($this->length * $this->width); } } // 从Rectangle类创建一个新对象 $obj = new Rectangle; // 获取对象属性值 echo $obj->length; // 输出: 0 echo $obj->width; // 输出: 0 // تعيين قيمة خاصية الكائن $obj->length = 30; $obj->width = 20; // قراءة قيم الخاصيات الخاصة بالكائن مرة أخرى لعرض التغيير echo $obj->length; // الإخراج: 30 echo "<br>"; echo $obj->width; // الإخراج: 20 // استدعاء طريقة الكائن echo $obj->getPerimeter(); // الإخراج: 100 echo "<br>"; echo $obj->getArea(); // الإخراج: 600 ?>测试看看‹/›
الرمز البديل (->) هو بناء OOP يستخدم لتحديد الوصول إلى الخصائص والمETHODS المضمونة في الكائن المحدد. بينما يوفر المتغير الظاهري $this إشارة إلى الكائن الذي يتم استدعاء الطريقة فيه (أي الكائن الذي ينتمي إلى الطريقة).
عند استخدام عدة نماذج من نفس الفئة، يظهر قوة برمجة التوجه إلى الكائن كما هو موضح في المثال التالي:
<?php // تعريف الفئة class Rectangle { //声明属性 public $length = 0; public $width = 0; // طريقة لحساب المحيط public function getPerimeter() { return (2 * ($this->length + $this->width)); } // طريقة لحساب المساحة public function getArea() { return ($this->length * $this->width); } } // إنشاء عدة كائنات من فئة Rectangle $obj1 = new Rectangle; $obj2 = new Rectangle; // استدعاء طريقة كلا الكائنين echo $obj1->getArea(); // الإخراج: 0 echo $obj2->getArea(); // الإخراج: 0 // تعيين قيم الخاصيتين لبجائز $obj1 $obj1->length = 30; $obj1->width = 20; // تعيين قيم الخاصيتين لبجائز $obj2 $obj2->length = 35; $obj2->width = 50; // استدعاء طريقة كلا الكائنين echo $obj1->getArea(); // الإخراج: 600 echo "<br>"; echo $obj2->getArea(); // الإخراج: 1750 ?>测试看看‹/›
كما هو موضح في المثال السابق، عند استدعاء طريقة getArea() على كائنات مختلفة، يتم تنفيذ هذه الطريقة على مجموعة بيانات مختلفة. كل كائن منفرد هو مستقل تمامًا، يمتلك خصائصه ومETHODS الخاصة، لذا يمكن معالجته بشكل مستقل حتى لو كان ينتمي إلى نفس الفئة.
لتمكين برمجة التوجه إلى الكائن، يقدم PHP بعض الطرق السحرية التي يتم تنفيذها تلقائيًا عند حدوث بعض العمليات في الكائن.
على سبيل المثال، كلما تم إنشاء كائن جديد، يتم تنفيذ الطريقة السحرية __construct() (تسمى بناء الكائن) تلقائيًا. بنفس الطريقة، يتم تنفيذ الطريقة السحرية __destruct() (تسمى دالة التدمير) تلقائيًا عند تدمير الكائن. بعد تدمير الكائن، ستقوم دالة التدمير بحذف جميع الموارد المخصصة للكائن.
<?php class MyClass { // 构造函数 public function __construct(){ echo ' 类 "' . __CLASS__ . '" 已启动<br>; } // مدمج public function __destruct() { إخراج 'الفئة "' . __CLASS__ . '" تم تدمير<br>'; } } // إنشاء كائن جديد $obj = new MyClass; // إخراج رسالة في نهاية الملف إخراج "وصلت إلى نهاية الملف."; ?>测试看看‹/›
上面示例中的PHP代码将产生以下输出:
تم بدء الفئة "MyClass" وصلت إلى نهاية الملف. تم تدمير الفئة "MyClass"
في نهاية سكربت سيتم تلقائيًا استدعاء دالة التدمير. ولكن، لتفعيل دالة التدمير بشكل واضح، يمكنك استخدام دالة PHP unset() لتدمير الكائن، كما هو موضح أدناه:
<?php class MyClass { // 构造函数 public function __construct(){ echo ' 类 "' . __CLASS__ . '" 已启动<br>; } // مدمج public function __destruct() { إخراج 'الفئة "' . __CLASS__ . '" تم تدمير<br>'; } } // إنشاء كائن جديد $obj = new MyClass; // تدمير الكائن unset($obj); // إخراج رسالة في نهاية الملف إخراج "وصلت إلى نهاية الملف."; ?>测试看看‹/›
الآن، سينتج PHP الكود في المثال التالي كخروج:
تم بدء الفئة "MyClass" تم تدمير الفئة "MyClass" وصلت إلى نهاية الملف.
提示:بعد اكتمال سكربت PHP، سيقوم PHP بإزالة جميع الموارد المخصصة أثناء التنفيذ تلقائيًا، مثل إغلاق اتصال قاعدة البيانات، تدمير الكائنات، إلخ.
ملاحظة:__CLASS__ هوالقيم الت魔术ية، والتي تحتوي على اسم الفئة الموجودة. إذا كان ذلك في خارج الفئة، فهو فارغ.
يمكن للفئة استخدام كلمة المفتاح extends للاستفادة من خصائص وطرق فئة أخرى. عملية الاستفادة تسمى الوراثة. قد تكون هذه هي السبب الأقوى وراء استخدام نموذج البرمجة الموجه بالكائنات.
<?php // تعريف الفئة class Rectangle { //声明属性 public $length = 0; public $width = 0; // طريقة لحساب المحيط public function getPerimeter() { return (2 * ($this->length + $this->width)); } // طريقة لحساب المساحة public function getArea() { return ($this->length * $this->width); } } // إنشاء فئة جديدة بناءً على فئة موجودة class Square extends Rectangle { // طريقة لاختبار ما إذا كانت المربع أيضًا مربعًا public function isSquare() { if ($this->length == $this->width) { return true; // مربع else { return false; // ليس مربعًا } } } // إنشاء كائن جديد من فئة Square $obj = new Square; // تعيين قيم الخاصيات للكائن $obj->length = 20; $obj->width = 20; // دعوة طريقة الكائن if ($obj->isSquare()) { إخراج "مساحة المربع هي"; else { echo "矩形的面积是"; }; echo $obj->getArea(); ?>测试看看‹/›
上面示例中的PHP代码将产生以下输出:
正方形的面积是 400
正如您在上面的示例中看到的,尽管Square的类定义既没有显式包含getArea()方法,也没有显式包含$length和$width属性,但是Square类的实例可以使用它们,因为它们继承自父Rectangle类。
提示:由于子类是从父类派生的,因此也称为派生类,其父类称为基类。
在使用类时,您甚至可以使用可见性关键字来限制对其属性和方法的访问,以实现更好的控制。 有三个可见性关键字(从最可见到最不可见):public,protected,private,它们确定如何以及从何处访问和修改属性和方法。
public - 可以从类内部和外部的任何位置访问公共属性或方法。 这是PHP中所有类成员的默认可见性。
protected - 受保护的属性或方法只能从类本身或子类或继承类(即扩展该类的类)中访问。
private - 私有属性或方法只能从定义它的类中访问。甚至子类或继承的类也无法访问私有属性或方法。
以下示例将向您展示这种可见性实际上是如何工作的:
<?php // تعريف الفئة class Automobile { //声明属性 public $fuel; protected $engine; private $transmission; } class Car extends Automobile { // 构造函数 public function __construct(){ echo ' 类 "' . __CLASS__ . '" 已启动<br>; } } //从Automobile类创建对象 $automobile = new Automobile; //尝试设置$automobile对象属性 $automobile->fuel = 'Petrol'; // ok $automobile->engine = '1500 cc'; // fatal error $automobile->transmission = 'Manual'; // fatal error //从Car类创建对象 $car = new Car; //尝试设置$car对象属性 $car->fuel = 'Diesel'; // ok $car->engine = '2200 cc'; // fatal error $car->transmission = 'Automatic'; // undefined ?>
بالإضافة إلى الحصرية، يمكن إعلان الخصائص والطرق كـ static (صلبة)، مما يسمح بولوجها دون الحاجة إلى مثيل للفئة. يمكن الوصول إلى الخصائص والطرق الصلبة باستخدام عميل التوليد (::)، كما يلي: ClassName::$property و ClassName::method().
على الرغم من أنه يمكن استخدام الطرق الصلبة، لا يمكن الوصول إلى الخصائص الصلبة المعلن عنها عبر مثيل للفئة، كما هو موضح في المثال التالي:
<?php // تعريف الفئة class HelloClass { // إعلان الخاصية الصلبة public static $greeting = "Hello World!"; // إعلان طريقة صلبة public static function sayHello(){ echo self::$greeting; } } // محاولة الوصول مباشرة إلى الخصائص والطرق الكبيرة echo HelloClass::$greeting; // Output: Hello World! HelloClass::sayHello(); // Output: Hello World! // محاولة الوصول إلى الخصائص والطرق الكبيرة عبر الهدف $hello = new HelloClass; echo $hello->greeting; // Strict Warning $hello->sayHello(); // Output: Hello World! ?>
في المثال السابق، يعني مفتاح self "النوع الحالي". لا يمكن أن يبدأ بمؤشر ($) ويبدأ دائمًا بعميل التوليد (::) (مثل self :: $name).
مفتاح self مختلف عن مفتاح this، ويعني "الهدف الحالي" أو "مثال الفئة الحالي". هذا المفتاح دائمًا يبدأ بمؤشر ($) ويتبعه عميل التوليد (->) (مثل $this->name).
ملاحظة:بما أن يمكن طلب الوسائط في أي وقت بدون مثيل للفئة (أي الهدف)، فإن المتغير الوهمي $this غير متاح في الطرق المعلن عنها كـ static.
نحن نأمل أنك الآن قد فهمت المفاهيم الأساسية للبرمجة الموجهة بالأحداث. ستجد المزيد من الأمثلة على OOP في جزء PHP وMySQL.