هل يمكنني جعل متغيرًا مرئيًا عالميًا دون الحاجة إلى إعلان أنه عالمي في كل مُنشئ من فئة PHP؟

StackOverflow https://stackoverflow.com/questions/1234445

سؤال

لدي فئة قاعدة بيانات ، والتي يتم إعلان مثيلها بشكل رئيسي index.php كما

$db = new Database();

هل هناك طريقة ل $db متغير يتم التعرف عليه عالميًا في جميع الفئات الأخرى دون الحاجة إلى الإعلان

global $db;

في مُنشئ كل فئة؟

هل كانت مفيدة؟

المحلول

لا. عليك أن تعلن Global $ DB في مُنشئ كل فصل.

أو يمكنك استخدام الصفيف العالمي: $ _globals ['vars'] ؛

الطريقة الوحيدة للالتفاف حول هذا الأمر هي استخدام فئة ثابتة للفها ، تسمى طريقة المفرد (نرى هنا للحصول على شرح). لكن هذه ممارسة سيئة للغاية.

  class myClass
   {
    static $class = false;
    static function get_connection()
    {
        if(self::$class == false)
        {
            self::$class = new myClass;
        }
        else
        {
            return self::$class;
        }
    }
    // Then create regular class functions.
   }

تم إنشاء طريقة Singleton للتأكد من وجود مثيل واحد فقط من أي فصل. ولكن ، لأن الناس يستخدمونها كوسيلة لاختصار Globalling ، يصبح معروفًا باسم البرمجة البطيئة/السيئة.

المعرفة stackoverflow
كيفية تجنب استخدام الكائنات العالمية PHP
مشاركة المتغيرات بين الوظائف في PHP دون استخدام Globals
جعل متغيرًا عالميًا متاحًا لكل وظيفة داخل الفصل
العالمي أو المفرد لاتصال قاعدة البيانات

نصائح أخرى

أفعل ذلك قليلاً. عادة ما يكون لدي كائن تطبيق عالمي (APP). ضمن هذا الكائن أقوم ببعض التهيئة الأساسية مثل إنشاء كائنات DB الخاصة بي ، وكائنات التخزين المؤقت ، إلخ.

لدي أيضًا وظيفة عالمية تُرجع كائن التطبيق .... وبالتالي (تعريف كائن التطبيق غير معروض):

define('APPLICATION_ID', 'myApplication');

${APPLICATION_ID} = new App;

function app() {
    return $GLOBALS[APPLICATION_ID];
}

إذن يمكنني استخدام شيء مثل ما يلي في أي رمز للإشارة إلى الكائنات داخل الكائن العالمي:

app()->db->read($statement);
app()->cache->get($cacheKey);
app()->debug->set($message);
app()->user->getInfo();

إنه ليس مثاليًا ولكني أجدها لجعل الأمور أسهل في العديد من الظروف.

يمكنك استخدام

$GLOBALS['db']->doStuff();

أو بدلاً من ذلك باستخدام نوع من طريقة الوصول إلى Singleton

Database::getInstance()->doStuff();

لماذا لا تنشئ فئة تحتوي على global $db; في مُنشئها ، ثم تمديد جميع الفصول الأخرى من هذا؟

يمكنك استخدام أ Registry الفصل لتخزين واسترداد الخاص بك Database نموذج.

class Registry
{
    protected static $_data = array();

    public static function set($key, $value)
    {
        self::$_data[$key] = $value;
    }

    public static function get($key, $default = null)
    {
        if (array_key_exists($key, self::$_data)) {
            return self::$_data[$key];
        }

        return $default;
    }
}

Registry::set('db', new Database());
$db = Registry::get('db');
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top