اذهب إلى المحتوى

السؤال

نشر

السلام عليكم

أنا جديد في البرمجة كائنية الوجه وواجهتني مشكلة جعل المتغير $conn متغير global داخل الكلاس

حينما أريد جعل المتغير global داخل function أقوم بكتابة الكود التالي

global $conn;

فعندما كتبته داخل class بدل من function واجهتني مشكلة ذات خطأ: 

Parse error: syntax error, unexpected token "global", expecting "function" or "const" in C:\xampp\htdocs\private\teachers.php on line 10

فما الحل؟ 

الكود المستخدم

 

Capture.PNG

Recommended Posts

  • 0
نشر

إذا كنت تقصد تعريف خاصية مشتركة لجميع الأغراض التي سوف تبنيها من الصنف teachers فعليك استخدام محدد الوصول 

static

تعديل إضافة أمثلة:

استخدام static ضمن صنف class:

class Foo {
    static $my_var = 'Foo';
}

$x = new Foo(); // انشاء غرض جديد

echo $x::$my_var;  // للوصول للمتحول المشارك نستخدم النقطتين
echo $x->my_var;   // هذه الطريقة لا تعمل وسيظهر الخطأ Notice: Undefined property: Foo::$my_var

لاحظ في المثال التالي أن المتغير الذي نوعه static سيكون مشترك و سيحافظ على التغييرات التي تحصل عليه حتى لو من غرض مختلف.

<?php
   function keep_track() {
      STATIC $count = 0;
      $count++;
      print $count;
      print "<br />";
   }
   
   keep_track();
   keep_track();
   keep_track();
?>

///////////
الخرج
1
2
3

وهذا مثال للفرق بين قيمة متغير static وآخر ليس static:

function a() {
  static $i = 0;
  $j = 0;
  return array($i++, $j++);
}
لاحظ أنه يحتفظ بقيمة i المعدلة

ويعيد تعريف j

print_r(a()); // array(0, 0)
print_r(a()); // array(1, 0)
print_r(a()); // array(2, 0)
//...

استخدام static في دالة function:

function test()
{
    static $a = 0;
    echo $a;
    $a++;
}

test();  // prints 0
test();  // prints 1
test();  // prints 2

 

  • 0
نشر

في البرمجة كائنية التوجه، عندما نريد تعريف متغير عام داخل الصنف، يمكننا أن نصل له من أي مكاk يمكننا استخدام الكلمة المفتاحية public

 public $global_variable;

لاحظ المثال التالي:

<?php
 /**
 * الوراثة في PHP
 */
 class Grandfather
 {
     // متغير عام 
     public $global_variable;
     // الدالة البانية للصنف grandfather
     function __construct()
     {
         $this->global_variable = 56;
         echo "I am grandfather <br>";
     }
     function default_function()
     {
         echo "this is default function in grandfather <br>";
     }
     private function private_function()
     {
         echo "this is private function in grandfather <br>";
     }
     protected function protected_function()
     {
         echo "this is protected function in grandfather <br>";
     }
     public function public_function()
     {
         echo "this is public function in grandfather <br>";
     }
 }
 /**
 * هذا صنف فرعي مشتق من الصنف  Grandfather
 * وسيرث كل خاصياته عدا الخاصة (private) منها
 */
 class Father extends Grandfather
 {
     // متغير عام
     public $father_var;
     function __construct()
     {
         // السطر الآتي مساوٌ للسطر => parent::__construct();
         Grandfather::__construct();
         $this->father_var = 256;
         echo "I am father <br>";
     }
     public function display_all()
     {
         $this->default_function();
         $this->protected_function();
         $this->public_function();
         echo "I am father's display_all <br>";
         parent::public_function();
     }
 }
 /**
 * هذا الصنف الابن يرث من الصنف الأب
 * ويرث أيضًا (بشكلٍ غير مباشر) من الصنف الجد
 */
 class Child extends Father
 {
     // الدالة البانية في الصنف الابن
     function __construct()
     {
         Grandfather::__construct();
         echo "I am child <br>";
     }
     // يُعدِّل الابن في دالة موجودة في الأب
     // تسمى هذه العملية «إعادة تعريف الدوال»
     function display_all()
     {
         echo "function from father<br>";
         // استدعاء دالة من الصنف الأب
         parent::display_all();
         echo "new added in child<br>";
     }
 }
 $obj = new Father();
 $obj->display_all();

 echo "<br><br><br>Child object call<br><br>";
 $obj2 = new Child();
 $obj2->display_all();
?>

الناتج من هذه الأكواد:

I am grandfather 
I am father 
this is default function in grandfather 
this is protected function in grandfather 
this is public function in grandfather 
I am father's display_all 
this is public function in grandfather 
Child object call
I am grandfather 
I am child 
function from father
this is default function in grandfather 
this is protected function in grandfather 
this is public function in grandfather 
I am father's display_all 
this is public function in grandfather 
new added in child

حيث أنّ:

  • ال Public access: يتيح لنا الوصول لل methods من أي مكان 
  • الProtected access: يتيح لنا الوصول لل methods من داخل ال class نفسه أو داخل ال class الذي يرث منه أي ال child class
  • ال Private access: يتيح الوصول لل methods من داخل الصنف نفسه فقط و لا يتاح للأبناء الوصول له

 

  • 0
نشر

إذا كنت تريد وضع خاصية الإتصال بقاعدة البيانات في الصنف Teacher فطريقة فهمك للبرمجة الكائنية خاطئة، إسأل نفسك هل الأستاذ لديه خاصية إسمها إتصال بقاعدة بيانات لا فهذا غير منطقي، يُمكن أن يكون للأستاذ إسم و لقب يُمكن أن يكون له سنوات خبرة كم، راتبه هذه الأشياء المُتعلقة بالأستاذ يُمكن وضعها في الصنف الخاص به، أما ما تُحاول القيام به فهو غير منطقي، الصواب هو أن تقوم ببناء كلاس يتعلق بقاعدة البيانات و تضع الأشياء المُتعلقة بقاعدة البيانات فيه مثلا كلاس إسمه Database

  • 0
نشر

يمكنك جلب أي متغير global داخل الكلاس بالطريقة التالية, هو أن تقوم بجعل المتغير global ومن ثم تقوم استدعائه عن طريق $GLOBALS , من خلال الأمثلة ستتضح لك الفكرة.

يوجد لدينا ملف db.php

<?php 
$appConfig = array(
	'db' => array(
		'host' => 'localhost', 
		'username' => 'root',
		'password' => '',
		'database' => 'database'
	),
);

ويوجد لدينا ملف index.php 

<?php 
require('db.php');
class Teacher
{
	public function __construct()
	{
		global $appConfig;
		echo $appConfig['db']['username'];
	}
}
$p = new Teacher();
?>

فلو تلاحظ أننا قمنا بجلب بيانات من المصفوفة بعد أن قمنا بجعل المتغير لها عام و من ثم استدعينا index معين لنطبع نتيجته.

 

10.PNG

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...