0

请告诉我我在哪里做错了......

我有3节课。这些都是这样的。。

  1. 我遵循单例设计模式的单例类
  2. 类公羊
  3. 山姆班

在“ram”类中,我正在为单例类对象设置数据。

现在,在“sam”类中。我正在尝试访问 sam 类的 show_data() 函数中的单例类对象。

什么时候,我用..

Print_r($this) : showing empty object

但是,当我使用以下代码时..

$singleton_obj = Singleton::getInstance();
print_r($singleton_obj); : Showing content of singleton object

我的问题是, 为什么在Print_r($this)的情况下它显示的是空对象。有什么办法,我可以使用Print_r($this)获取单例类对象的内容。

我的课程文件是这个..

<?php 
class Singleton
{
 // A static property to hold the single instance of the class
private static $instance;

// The constructor is private so that outside code cannot instantiate
public function __construct() { }

// All code that needs to get and instance of the class should call
// this function like so: $db = Database::getInstance();
public function getInstance()
{
  // If there is no instance, create one
  if (!isset(self::$instance)) {
    $c = __CLASS__;
    self::$instance = new $c;
  }
  return self::$instance;
}

// Block the clone method
private function __clone() {}


// Function for inserting data to object
public function insertData($param, $element)
{
$this->{$param} = $element;
}
}

//---CLASS ram---
class ram
{
    function __construct() 
    {
        $db = Singleton::getInstance();
        $db->insertData('name', 'Suresh');
    }
}

$obj_ram = new ram;

//---CLASS sam---
class sam extends Singleton
{
    function __construct()
    {
        parent::__construct();
   }

   public function show_data()
   {
    echo "<br>Data in current object<br>";
    print_r($this);

    echo "<br><br>Data in singleton object<br>";
        $singleton_obj = Singleton::getInstance();
        print_r($singleton_obj);
   } 
}

$obj_sam = new sam;
echo $obj_sam->show_data(); 
?>
4

3 回答 3

2

您正在sam通过“”创建一个“”对象new sam,您应该使用“ sam::getInstance()”;到达静态实例但它不是“sam object”类型将是“Singleton”“。” __ CLASS __ " 给出范围类而不是真正的对象类。

第一:你必须阅读php中的“后期静态绑定”,了解self::和__CLASS__ 使用“ static::”而不是“ ”的局限性( 5.3+self::

或者你可以改变所有的模式使用静态像;

   <?php 
    class Singleton
    {
        // A static property to hold the single instance of the class
        private static $instance;

        // The constructor is private so that outside code cannot instantiate
        public function __construct() { }

        // All code that needs to get and instance of the class should call
        // this function like so: $db = Database::getInstance();
        public static function getInstance()
        {
            // If there is no instance, create one
            if (!isset(self::$instance)) {
                $c = __CLASS__;
                self::$instance = new $c;
            }
            return self::$instance;
        }

        // Block the clone method
        private function __clone() {}


        // Function for inserting data to object
        public function insertData($param, $element)
        {
            $this->{$param} = $element;
        }
    }

    //---CLASS ram---
    class ram
    {
        function __construct() 
        {
            $db = Singleton::getInstance();
            $db->insertData('name', 'Suresh');
        }
    }

    $obj_ram = new ram;

    //---CLASS sam---
    class sam extends Singleton
    {
        function __construct()
        {
            parent::__construct();
        }

        public static function show_data()
        {
            echo "<br>Data in current object<br>";
            print_r(self::getInstance());
            echo "<br><br>Data in singleton object<br>";
            $singleton_obj = Singleton::getInstance();
            print_r($singleton_obj);
        } 
    }

$obj_sam = sam::getInstance();
print_r($obj_sam);

    echo sam::show_data();

这是一个将属性指针设置为当前对象的示例,例如“CI”

<?php 
    class Singleton
    {
        // A static property to hold the single instance of the class
        private static $instance;

        // The constructor is private so that outside code cannot instantiate
        public function __construct() {

            if(isset(self::$instance))
                foreach(self::$instance as $key => &$val)
                {
                    $this->{$key} = &$val;
            }
        }



        // All code that needs to get and instance of the class should call
        // this function like so: $db = Database::getInstance();
        public static function getInstance()
        {
            // If there is no instance, create one
            if (!isset(self::$instance)) {
                $c = __CLASS__;
                self::$instance = new $c;
            }
            return self::$instance;
        }

        // Block the clone method
        private function __clone() {}


        // Function for inserting data to object
        public function insertData($param, $element)
        {
            $this->{$param} = $element;
        }
    }

    //---CLASS ram---
    class ram
    {
        function __construct() 
        {
            $db = Singleton::getInstance();
            $db->insertData('name', 'Suresh');
        }
    }

     class ram2
    {
        function __construct() 
        {
            $db = Singleton::getInstance();
            $db->insertData('name', 'Suresh');
            $db->insertData('name2', 'Suresh2');
        }
    }

    $obj_ram = new ram;
    $obj_ram = new ram2;

    //---CLASS sam---
    class sam extends Singleton
    {
        function __construct()
        {
            parent::__construct();
        }

        public function show_data()
        {
            echo "<br>Data in current object<br>";
            print_r($this);

            echo "<br><br>Data in singleton object<br>";
            $singleton_obj = Singleton::getInstance();
            print_r($singleton_obj);
        } 
    }

    $obj_sam = new sam;
    echo $obj_sam->show_data(); 
于 2012-07-08T10:28:26.353 回答
0

您的单身人士没有得到“初始化” - 它不会创建任何对象。所以$this是指什么都没有。

编辑:原来我错了——我经常看到单身人士将 __construct() 声明为private. 这就是拒绝实例化类的新实例的方式。不知道你的情况是怎么回事。

编辑2:有什么问题?您的代码按预期运行。您正在创建一个sam没有数据的新对象,因此您得到一个空对象。当您打印单例对象时,您会看到单例的数据。

编辑 3:我从未见过单例被扩展。我认为这是模式的错误应用,我当然可能是错的。

于 2012-07-08T10:08:42.400 回答
0

您不能从该类对象中访问类的静态属性。

A property declared as static can not be accessed with an instantiated class object (though a static method can).

http://php.net/manual/en/language.oop5.static.php

于 2012-07-08T10:29:33.860 回答