Как разделить динамическую переменную между файлами в PHP (5)? - PullRequest
2 голосов
/ 15 марта 2012

У меня есть объект некоторого класса, который подчиняется шаблону синглтона. Мне нужно инициализировать его в одном файле, а затем использовать его в других. Я не знаю, как это сделать, вот что я попробовал:

//myClass.php
class myClass
{
    private static $instance = null;

    private function __construct($args)
    {
        //stuff
    }

    public function Create($args)
    {
        self::$instance = new myClass($args);
        return self::$instance;
    }

    public function Get()
    {
        return self::$instance;
    }
}

//index.php
<?php
require_once('myClass.php');
$instance = myClass::Create($args);
?>
<a href="test.php">Test Me!</a>

//test.php
echo(is_null(myClass::Get())); //displays 1

Итак, проблема в том, что test.php, myClass::get() всегда возвращает ноль!

Я также пытался сохранить экземпляр в $_SESSION, что дает мне тот же результат. Не могли бы вы указать мне правильное направление?

Ответы [ 2 ]

0 голосов
/ 27 марта 2012

Вы должны включать файл с определением класса в каждый файл, в котором он используется (и он должен быть включен до его использования).

<?php // filename: test.php
include_once("myClass.php");
$oClassInstance = myClass::Get();

var_dump($oClassInstance);

КСТАТИ

Вы не делаетенужно определить эти два метода Create и Get.Вы можете создать только один метод с именем getInstance:

// only one instance of the class
private static $_oInstance = null;

public static function getInstace()
{
    if (!self::$_oInstance)
    {
        self::$_oInstance = new self();
    }

    return self::$_oInstance;
}

И затем вы можете использовать его следующим образом:

<?php // filename: index.php
include_once("myClass.php");

// if instance does not exist yet then it will be created and returned
$oClass = myClass::getInstace();

<?php // filename: test.php
include_once("myClass.php");

// the instance already created and stored in myClass::$_oInstance variable
// so it just will be returned
$oClass = myClass::getInstance();

UPD

Если вам нужно поместить некоторые аргументы в конструктор, просто используйте предопределенные аргументы:

private function __construct($aArg)
{
    // this code will be launched once when instance is created
    // in the any other cases you'll return already created object
}

public static function getInstance($aArgs = null)
{
    if (!self::$_oInstance)
    {
        self::$_oInstance = new self($aArgs);
    }

    return self::$_oInstance;
}

ОТВЕТ

Извините, что вам нужно прокрутить несколько экранов, чтобы найти это =))) Причина, по которой вы не можете использовать myClass::Get() в своем контексте, состоит в том, что у вас есть 2 сценария, что означает - две разные программы.Singleton следует использовать в одном приложении (один скрипт).

Таким образом, в вашем случае правильное использование будет иметь модульную систему: - index.php - main.php - test.php

// file: index.php
include_once "myClass.php"

$module = $_GET["module"];
include_once $module ".php";

// file: main.php
$oClass = myClass::Create($someArgs);
var_dump($oClass); // you'll see you class body

// file: test.php
$oClass=  myClass::Get();
var_dump($oClass); // you'll see the same class body as above

И ваши ссылки будут:

  • index.php? Module = main
  • index.php? Module = test
0 голосов
/ 27 марта 2012

Функция Create () должна проверить, имеет ли свойство $ instance уже значение, прежде чем создавать новый объект.Например,

public function Create()
{
    if (is_null(self::$instance)) {
        self::$instance = new self();
    }
    return self::$instance;
}

В test.php вы можете просто вызвать myClass :: Create (), вообще не нужно иметь функцию Get ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...