في البرمجة الشيئية (بالإنجليزية: Object-Oriented programming، اختصارًا: OOP)، الكائن هو كل يتكون من معلومات ووصف لكيفية معالجة المعلومات، وهو عبارة عن تجريد للعالم الحقيقي.
في العالم الحقيقي، الأشياء التي نواجهها هي أشياء، مثل أجهزة الكمبيوتر وأجهزة التلفزيون والدراجات وما إلى ذلك.
هناك ثلاث خصائص رئيسية للأشياء:
سلوك الكائن: ما هي العمليات التي يمكن تطبيقها على الكائن، تشغيل الضوء وإطفاء الضوء هي سلوكيات.
شكل الكائن: كيف يستجيب الكائن عند تطبيق تلك الأساليب، اللون، الحجم، المظهر.
تمثيل الأشياء: تمثيل الأشياء يعادل بطاقة الهوية، وتحديداً تمييز الاختلافات في نفس السلوك والحالة.
على سبيل المثال، الحيوان عبارة عن فئة مجردة، يمكننا تحديد كلب وخروف، والكلاب والأغنام كائنات ملموسة، ولها سمات لونية، ويمكن كتابتها، ويمكن تشغيلها وحالات سلوكية أخرى.
الطبقة - تحدد الخصائص المجردة للشيء. يتضمن تعريف الفئة شكل البيانات والعمليات التي تتم على البيانات.
الكائن - هو مثيل لفئة.
متغيرات الأعضاء - المتغيرات المحددة داخل الفصل. قيمة هذا المتغير غير مرئية للعالم الخارجي، ولكن يمكن الوصول إليها من خلال وظائف الأعضاء. بعد إنشاء مثيل للفئة ككائن، يمكن تسمية المتغير بسمة للكائن.
وظائف الأعضاء - يتم تعريفها داخل الفصل ويمكن استخدامها للوصول إلى بيانات الكائن.
الميراث - الميراث هو آلية تقوم من خلالها الفئات الفرعية تلقائيًا بمشاركة هياكل البيانات وطرق فئتها الأصلية. هذه علاقة بين الفئات. عند تحديد فصل دراسي وتنفيذه، يمكنك القيام بذلك على أساس فصل دراسي موجود، وأخذ المحتوى المحدد بواسطة الفصل الحالي كمحتوى خاص بك، وإضافة بعض المحتوى الجديد.
الفئة الأصلية - يمكن تسمية الفئة التي ترثها الفئات الأخرى بالفئة الأصلية، أو الفئة الأساسية، أو الفئة الفائقة.
فئة فرعية - تسمى الفئة التي ترث من فئات أخرى فئة فرعية، أو يمكن أن تسمى أيضًا فئة مشتقة.
تعدد الأشكال - تعدد الأشكال يعني أنه يمكن تطبيق نفس الوظيفة أو الطريقة على أنواع متعددة من الكائنات والحصول على نتائج مختلفة. يمكن للكائنات المختلفة أن تنتج نتائج مختلفة عند تلقي نفس الرسالة. وتسمى هذه الظاهرة تعدد الأشكال.
التحميل الزائد - ببساطة، هو الموقف الذي يكون فيه للوظائف أو الأساليب نفس الاسم ولكن قوائم المعلمات المختلفة تسمى هذه الوظائف أو الأساليب التي لها نفس الاسم ومعلمات مختلفة وظائف أو أساليب مثقلة.
التجريد - يشير التجريد إلى تجريد الكائنات ذات هياكل البيانات (السمات) والسلوكيات (العمليات) المتسقة إلى فئات. الفصل عبارة عن تجريد يعكس الخصائص المهمة المتعلقة بالتطبيق مع تجاهل المحتوى الآخر غير ذي الصلة. إن تقسيم أي فئة أمر شخصي، ولكن يجب أن يكون مرتبطًا بالتطبيق المحدد.
التغليف - يشير التغليف إلى ربط خصائص وسلوك كائن موجود في العالم الحقيقي ووضعه ضمن وحدة منطقية.
يتم استخدام المُنشئ - بشكل أساسي لتهيئة الكائن عند إنشاء الكائن، أي تعيين القيم الأولية لمتغيرات عضو الكائن، ويتم استخدامه دائمًا مع العامل الجديد في العبارة لإنشاء الكائن.
المدمر - المدمر (المدمر) على عكس المنشئ، عندما ينهي الكائن دورة حياته (على سبيل المثال، تم استدعاء الوظيفة التي يوجد بها الكائن)، يقوم النظام تلقائيًا بتنفيذ المدمر. غالبًا ما تُستخدم أدوات التدمير للقيام بأعمال "التنظيف" (على سبيل المثال، عند إنشاء كائن، استخدم جديدًا لفتح مساحة ذاكرة، والتي يجب تحريرها مع الحذف في أداة التدمير قبل الخروج).
في الشكل أدناه، قمنا بإنشاء ثلاثة كائنات من خلال فئة السيارات: مرسيدس، بي إم دبليو، وأودي.
$mercedes = سيارة جديدة ()؛$bmw = سيارة جديدة ()؛$audi = سيارة جديدة ()؛
تنسيق بناء الجملة المعتاد لفئات تعريف PHP هو كما يلي:
<?phpclass phpClass { var $var1; var $var2 = "constant string"; function myfunc ($arg1, $arg2) { [..] } [..]}?>
التحليل هو كما يلي:
يتم تعريف الفئات باستخدام الكلمة الأساسية للفئة متبوعة باسم الفئة.
يمكن تعريف المتغيرات والأساليب ضمن زوج من الأقواس المتعرجة ({}) بعد اسم الفئة.
يتم الإعلان عن متغيرات الفئة باستخدام var ، ويمكن أيضًا تهيئة المتغيرات.
تتشابه تعريفات الوظائف مع تعريفات وظائف PHP، ولكن لا يمكن الوصول إلى الوظائف إلا من خلال الفئة والكائنات التي تنشئ مثيلاً لها.
<?phpclass Site { /* متغيرات الأعضاء*/ var $url; /* وظائف الأعضاء*/ function setUrl($par){ $this->url = $par } function getUrl(){ echo $this ->url . PHP_EOL } function setTitle($par){ $this->title = $par } function getTitle(){ echo $this->title . }}?>
يمثل المتغير $this الكائن الخاص به.
PHP_EOL هو حرف السطر الجديد.
بعد إنشاء فئة، يمكننا استخدام العامل الجديد لإنشاء كائنات من تلك الفئة:
$codercto = موقع جديد؛$taobao = موقع جديد؛$google = موقع جديد؛
في الكود أعلاه، قمنا بإنشاء ثلاثة كائنات، كل كائن من الكائنات الثلاثة مستقل. بعد ذلك، دعونا نلقي نظرة على كيفية الوصول إلى أساليب الأعضاء ومتغيرات الأعضاء.
بعد إنشاء كائن، يمكننا استخدامه لاستدعاء أساليب الأعضاء. يمكن أن تعمل أساليب الأعضاء في الكائن فقط على متغيرات الأعضاء في الكائن:
// اتصل بوظيفة العضو لتعيين العنوان وعنوان URL $codercto->setTitle( "Coder Tutorial" );$taobao->setTitle( "Taobao" );$google->setTitle( "Google Search" );$codercto- > setUrl( 'www.codercto.com' );$taobao->setUrl( 'www.taobao.com' );$google->setUrl( 'www.google.com' );// اتصل بوظيفة العضو للحصول على العنوان وعنوان URL $codercto->getTitle();$taobao->getTitle();$google->getTitle();$codercto->getUrl();$taobao-> getUrl( );$google->getUrl();
الكود الكامل هو كما يلي:
<?php class Site { /* متغيرات الأعضاء */ var $url ; var $title ; /* وظائف الأعضاء */ function setUrl ( $par ){ $this -> url = $par } function getUrl (){ echo $ هذا - > url ; }} $codercto = موقع جديد ; $taobao = موقع جديد ; $google = موقع جديد ; // استدعاء وظيفة العضو وضبط العنوان وعنوان URL $ codercto -> setTitle ( " Coder Tutorial" ); " ); $google -> setTitle ( "بحث Google" ); $codercto -> setUrl ( 'www.codercto.com' ); $taobao -> setUrl ( 'www.taobao.com' ); $google - > setUrl ( 'www.google.com' ); // اتصل بوظيفة العضو للحصول على العنوان وعنوان URL $ codercto -> getTitle ( ) ; ); $google -> getTitle ( ) ; $codercto -> getUrl (); $ taobao - > getUrl ( ) ;
بتنفيذ الكود أعلاه، تكون نتيجة الإخراج هي:
البرنامج التعليمي لمزارع الكود على تاوباو بحث Google www.codercto.comwww.taobao.comwww.google.com
المنشئ هو نوع خاص من الأساليب. يتم استخدامه بشكل أساسي لتهيئة الكائن عند إنشاء الكائن، أي تعيين قيم أولية لمتغيرات عضو الكائن، واستخدامها مع العامل new
في العبارة لإنشاء الكائن.
يتيح PHP 5 للمطورين تعريف الطريقة كمنشئ في فئة ما، بالصيغة التالية:
باطلة __construct ([ وسيطات $ مختلطة [، $... ]] )
في المثال أعلاه، يمكننا تهيئة متغيرات $url و$title من خلال التابع المنشئ:
دالة __construct( $par1, $par2 ) { $this->url = $par1;
الآن لم نعد بحاجة إلى استدعاء الأساليب setTitle وsetUrl:
$codercto = موقع جديد('www.codercto.com', 'برنامج تعليمي للمبرمج');$taobao = موقع جديد('www.taobao.com', 'Taobao');$google = موقع جديد('www.google . com'، 'بحث Google')؛// اتصل بوظيفة العضو للحصول على العنوان وعنوان URL $codercto->getTitle();$taobao->getTitle();$google->getTitle();$codercto->getUrl();$taobao->getUrl(); $google ->getUrl();
المدمر (المدمر) على عكس المنشئ، عندما ينهي الكائن دورة حياته (على سبيل المثال، تم استدعاء الوظيفة التي يوجد بها الكائن)، يقوم النظام تلقائيًا بتنفيذ المدمر.
قدم PHP 5 مفهوم المدمرات، والذي يشبه اللغات الأخرى الموجهة للكائنات، وصيغته كما يلي:
باطلة __تدمير (باطلة)
<?phpclass MyDestructableClass { function __construct() { print "constructorn"; $this->name = "MyDestructableClass" } function __destruct() { print "destroy" $this->name }; }$obj = new MyDestructableClass();?>
بتنفيذ الكود أعلاه، تكون نتيجة الإخراج هي:
يقوم المنشئ بتدمير MyDestructableClass
يستخدم PHP الكلمة الأساسية الممتدة لوراثة فئة ما. PHP لا يدعم الوراثة المتعددة. التنسيق كما يلي:
فئة الطفل تمتد الأصل { // جزء الكود}
في المثال، ترث فئة Child_Site فئة الموقع وتوسع وظائفها:
<?php // فئة فرعية توسع فئة الموقع class Child_Site Extends Site { var $category function setCate($par){ $this->category = $par } function getCate(){ echo $this->category . }}
إذا كانت الطريقة الموروثة من الفئة الأصلية لا يمكنها تلبية احتياجات الفئة الفرعية، فيمكن إعادة كتابتها. وتسمى هذه العملية بتجاوز الطريقة، والمعروفة أيضًا باسم إعادة كتابة الطريقة.
تم تجاوز طريقتي getUrl وgetTitle في المثال:
function getUrl() { echo $this->url ; return $this->url;} function getTitle(){ echo $this->title .
يتم التحكم في وصول PHP إلى الخصائص أو الأساليب عن طريق إضافة الكلمات الأساسية public (عام)، أو protected (محمي)، أو خاص (خاص) في المقدمة.
عام: يمكن الوصول إلى أعضاء الفصل العام من أي مكان.
محمي: يمكن الوصول إلى أعضاء الفئة المحمية بنفسها وفئاتها الفرعية والفئات الأصلية.
خاص: لا يمكن الوصول إلى أعضاء الفصل الخاص إلا من خلال الفصل الذي تم تعريفهم فيه.
يجب تعريف سمات الفئة على أنها عامة أو محمية أو خاصة. إذا تم تعريفه باستخدام var، فسيتم اعتباره عامًا.
<?php/** * تعريف MyClass */class MyClass{ public $public = 'Public'; protected $protected = 'Protected'; public $private = 'Private'; echo $this->protected; echo $this->private; }}$obj = new MyClass();echo $obj->public; // يمكن تنفيذ هذا السطر بشكل طبيعي echo $obj->protected; // سيُنشئ هذا السطر خطأً فادحًا echo $obj->private; // سيُنشئ هذا السطر أيضًا خطأً فادحًا $obj->printHello(); // Output Public, Protected and Private/** * Define MyClass2 */ class MyClass2 Extends MyClass{ // يمكن إعادة تعريف العامة والمحمية، ولكنها خاصة ولكن غير محمية $protected = 'Protected2'; $this->protected; echo $this->private; }}$obj2 = new MyClass2();echo $obj2->public; // يمكن تنفيذ هذا السطر بشكل طبيعي echo $obj2->private; معرف $obj2->protected; // سيولد هذا السطر خطأ فادحا $obj2->printHello(); // الإخراج عام، محمي 2 وغير محدد؟>
يمكن تعريف الأساليب الموجودة في الفصل على أنها عامة أو خاصة أو محمية. إذا لم يتم تعيين هذه الكلمات الأساسية، فستكون الطريقة افتراضية عامة.
<?php/** * تعريف MyClass */class MyClass{ // أعلن عن مُنشئ عام public function __construct() { } // أعلن عن طريقة عامة public function MyPublic() { } // أعلن عن طريقة محمية وظيفة محمية MyProtected( ) { } // أعلن عن طريقة خاصة public function MyPrivate() { } // هذه الطريقة هي وظيفة عامة Foo() { $this->MyPublic(); $this->MyProtected(); $this->MyPrivate(); }}$myclass = new MyClass;$myclass->MyPublic(); // يمكن تنفيذ هذا السطر بشكل طبيعي $myclass->MyProtected(); سيولد هذا السطر خطأً فادحًا $myclass->MyPrivate(); // سيولد هذا السطر خطأً فادحًا $myclass->Foo(); // يمكن تنفيذ كل من العام والمحمي والخاص/** * تعريف MyClass2 */class MyClass2 Extends MyClass{ // هذه الطريقة هي وظيفة عامة Foo2() { $this->MyPublic(); $this->MyProtected(); $this->MyPrivate(); إنشاء خطأ فادح}}$myclass2 = new MyClass2;$myclass2->MyPublic(); // يمكن تنفيذ هذا السطر بشكل طبيعي $myclass2->Foo2(); يمكن تنفيذ كلا النوعين العام والمحمي، ولكن لا يمكن تنفيذ الخاصين. class Bar { public function test() { $this->testPrivate(); $this->testPublic() } public function testPublic() { echo "Bar: :testPublicn"; } وظيفة خاصة testPrivate() { echo "Bar::testPrivaten"; }}class Foo Extends Bar { public function testPublic() { echo "Foo::testPublicn"; } public function testPrivate() { echo "Foo::testPrivaten" }}$myFoo = new foo();$myFoo->test(); // فو::testPublic?>
باستخدام الواجهة، يمكنك تحديد الأساليب التي يجب على الفصل تنفيذها، ولكنك لا تحتاج إلى تحديد المحتوى المحدد لهذه الأساليب.
يتم تعريف الواجهة من خلال الكلمة الأساسية للواجهة ، تمامًا مثل تحديد فئة قياسية، ولكن جميع الطرق المحددة فيها فارغة.
يجب أن تكون كافة الأساليب المحددة في الواجهة عامة، وهذه إحدى سمات الواجهات.
لتنفيذ واجهة، استخدم عامل التشغيل . يجب أن يقوم الفصل بتنفيذ كافة الأساليب المحددة في الواجهة، وإلا سيتم الإبلاغ عن خطأ فادح. يمكن للفئة تنفيذ واجهات متعددة استخدم الفواصل للفصل بين أسماء الواجهات المتعددة.
<?php// قم بتعريف واجهة واجهة "iTemplate" iTemplate{ public function setVariable($name, $var); public function getHtml($template);}// تنفيذ فئة الواجهة قالب بتنفيذ iTemplate{ Private $vars = array( ) ; وظيفة عامة setVariable($name, $var) { $this->vars[$name] = $var } public function getHtml($template) { foreach($this->vars as $name => $value) { $template = str_replace('{' . $name . '}', $value, $template } return $template }}
يمكن تعريف القيم التي تظل دون تغيير خلال الفصل الدراسي على أنها ثوابت. ليست هناك حاجة لاستخدام الرمز $ عند تعريف الثوابت واستخدامها.
يجب أن تكون قيمة الثابت قيمة ثابتة ولا يمكن أن تكون متغيرًا أو سمة فئة أو نتيجة عملية رياضية أو استدعاء دالة.
منذ الإصدار PHP 5.3.0، أصبح من الممكن استدعاء الفئات ديناميكيًا باستخدام متغير. لكن قيمة هذا المتغير لا يمكن أن تكون كلمة أساسية (مثل self أو الأصل أو static).
<?phpclass MyClass{ const Constant = 'constant value'; PHP_EOL; // منذ 5.3.0 $class = new MyClass();$class->showConstant();echo $class::constant . PHP_EOL; // منذ PHP 5.3.0؟>
يجب أن يتم الإعلان عن أي فئة مجردة إذا تم الإعلان عن طريقة واحدة على الأقل فيها مجردة.
لا يمكن إنشاء مثيل للفئات المعرفة على أنها مجردة.
الطريقة التي تم تعريفها على أنها مجردة تعلن فقط عن طريقة الاتصال (المعلمات) الخاصة بها ولا يمكنها تحديد تنفيذ الوظيفة المحددة الخاصة بها.
عند وراثة فئة مجردة، يجب أن تحدد الفئة الفرعية جميع الأساليب المجردة في الفئة الأصلية، بالإضافة إلى ذلك، يجب أن يكون التحكم في الوصول لهذه الأساليب هو نفسه (أو أكثر استرخاءً) كما هو الحال في الفئة الأصلية. على سبيل المثال، إذا تم الإعلان عن طريقة مجردة على أنها محمية، فيجب الإعلان عن الطريقة المطبقة في الفئة الفرعية على أنها محمية أو عامة، ولا يمكن تعريفها على أنها خاصة.
<?phpabstract class AbstractClass{ // إلزامي للفئات الفرعية لتحديد هذه الطرق وظيفة محمية مجردة getValue(); مجردة وظيفة محمية prefixValue($prefix); // طريقة عادية (طريقة غير مجردة) public function printOut() { print $this ->getValue() . PHP_EOL }}class ConcreteClass1 Extends AbstractClass{ protected function getValue() { return "ConcreteClass1" } public function prefixValue($prefix) { return "{$prefix}ConcreteClass1" }}class ConcreteClass2 Extends AbstractClass{ public function getValue() { return "ConcreteClass2" } public function prefixValue($prefix) { return "{$prefix}ConcreteClass2" }}$class1 = new ConcreteClass1;$class1->printOut();echo $class1->prefixValue('FOO_') .PHP_EOL;$class2 = new ConcreteClass2;$class2->printOut();echo $class2->prefixValue('FOO_')
بتنفيذ الكود أعلاه، تكون نتيجة الإخراج هي:
ConcreteClass1FOO_ConcreteClass1ConcreteClass2FOO_ConcreteClass2
بالإضافة إلى ذلك، يمكن أن تحتوي أساليب الفئة الفرعية على معلمات اختيارية غير موجودة في الطريقة المجردة للفئة الأصلية.
على سبيل المثال، إذا حددت فئة فرعية معلمة اختيارية لم يتم تضمينها في إعلان الطريقة المجردة للفئة الأصلية، فلا يزال من الممكن تشغيلها بشكل طبيعي.
<?phpabstract class AbstractClass{ // تحتاج طريقتنا المجردة فقط إلى تحديد المعلمات المطلوبة Abstract protected function prefixName($name);}class ConcreteClass Extends AbstractClass{ // يمكن لفئتنا الفرعية تحديد الخيارات الاختيارية غير الموجودة في توقيع الفئة الأصلية المعلمات public function prefixName($name, $separator = ".") { if ($name == "Pacman") { $prefix = "Mr" } elseif ($name == "Pacwoman") { $prefix = "Mrs" } else { $prefix = "" } return "{$prefix}{$separator} {$name}";$class = new ConcreteClass;echo $class->prefixName("Pacman "), "n";echo $class->prefixName("Pacwoman"), "n";?>
الإخراج هو:
السيد بكمن السيدة باكومان
من خلال الإعلان عن سمة أو أسلوب فئة على أنها ثابتة، يمكنك الوصول إليها مباشرة دون إنشاء مثيل للفئة.
لا يمكن الوصول إلى الخصائص الثابتة من خلال كائن من فئة تم إنشاء مثيل لها (ولكن يمكن الوصول إلى الطرق الثابتة).
نظرًا لأن الطرق الثابتة لا تتطلب استدعاء كائن، فإن المتغير الزائف $this غير متوفر في الطرق الثابتة.
لا يمكن للكائنات الوصول إلى الخصائص الثابتة من خلال عامل التشغيل ->.
منذ الإصدار PHP 5.3.0، أصبح من الممكن استدعاء الفئات ديناميكيًا باستخدام متغير. لكن قيمة هذا المتغير لا يمكن أن تكون الكلمات الأساسية ذاتية أو أصلية أو ثابتة.
<?phpclass Foo { public static $my_static = 'foo'; public function staticValue() { return self::$my_static }}print Foo::$my_static . >staticValue() .PHP_EOL;?>
بتنفيذ البرنامج أعلاه تكون نتيجة الإخراج هي:
com.foofoo
يضيف PHP 5 كلمة رئيسية نهائية جديدة. إذا تم الإعلان عن طريقة في الفئة الأصل نهائية، فلا يمكن للفئة الفرعية تجاوز الطريقة. إذا تم إعلان الفصل نهائيًا، فلا يمكن توريثه.
سيتم الإبلاغ عن خطأ عند تنفيذ الكود التالي:
<?phpclass BaseClass { public function test() { echo "BaseClass::test() call" . PHP_EOL } Final public function moreTesting() { echo "BaseClass::moreTesting() call" }}class ChildClass Extends BaseClass { public function moreTesting() { echo "ChildClass::moreTesting() call" PHP_EOL }}//. رسالة الخطأ خطأ فادح: لا يمكن تجاوز الطريقة النهائية BaseClass::moreTesting()?>
لن تقوم PHP باستدعاء مُنشئ الفئة الأصل تلقائيًا في مُنشئ الفئة الفرعية. لتنفيذ منشئ الفئة الأصل، تحتاج إلى استدعاء الأصل::__construct() في منشئ الفئة الفرعية.
<?phpclass BaseClass { function __construct() { print "طريقة البناء في فئة BaseClass" }}class SubClass Extends BaseClass { function __construct() {parent::__construct(); طريقة إنشاء الفئة print "طريقة البناء في فئة SubClass" }}class OtherSubClass Extends BaseClass { // وراثة طريقة إنشاء BaseClass}// استدعاء مُنشئ BaseClass $obj = new BaseClass(); // استدعاء مُنشئ BaseClass وSubClass $obj = new SubClass(); // استدعاء مُنشئ BaseClass $obj = new OtherSubClass();?>
بتنفيذ البرنامج أعلاه تكون نتيجة الإخراج هي:
طريقة البناء في فئة BaseClass طريقة البناء في فئة SubClass طريقة البناء في فئة BaseClass