2

ページのグローバル値など、ある種のセットアップクラスを作成しようとしています。

PHPコード

class globals
{
    public $page;

    public function __construct()
    {
    }

    public function set_page($value)
    {
        $this->page = $value; // Maybe from a database
    }
}

class get
{
    public function page()
    {
        $globals = new globals();
        return $globals->page;
    }
}

$globals = new globals();
$globals->set_page('My value');

echo get::page(); // Short function to be in a template

質問

  • 私のクラスは私が設定した値を忘れています。何故ですか?
  • グローバル変数を使用する必要がありますか?
  • これは問題に対する正しいアプローチですか?
4

7 に答える 7

3

変数は、クラスではなくオブジェクトに設定されます。

クラスごとに、複数のオブジェクトをインスタンス化できます。それらのそれぞれには、独自の可変スコープがあります。

于 2012-11-02T12:53:37.430 に答える
2

編集:
私はあなたの問題に対する最も簡単で最も冗長でない解決策を含めるのを忘れました。AFAIK、あなたはあなたがどのページにいるのかをチェックする方法を探しています。定数はまさにそれを行います:

defined('MY_CURRENT_PAGE') || define('MY_CURRENT_PAGE','My Value');
//use anywhere like so:
echo 'Currently on page: '.MY_CURRENT_PAGE;

私のクラスは私が設定した値を忘れています。何故ですか?

非常に単純です。pageメンバー関数は静的ではありませんが、次のように呼び出しますget::page()。これを修正したとしても、pageメソッドに新しいインスタンスを作成しますが、どこにも参照を保持していないため、page呼び出しごとglobalsに、何も設定されていない新しいインスタンスが作成されます。

グローバル変数を使用する必要がありますか?

いいえ、本当に必死でない限り、グローバルを使用しないでください

これは問題に対する正しいアプローチですか?

いいえ、機能しない場合は正しくありません(IMHO)。

さて、何ですか、あなたは尋ねるかもしれません。これを行うにはいくつかの方法があります。

class globals
{
    public static $page = null;//make this static, meaning all instances will share this var

    public function set_page($value)
    {
        self::$page = $value; // Maybe from a database
    }
}

class get
{
    private $_globalsInstance = null;
    public function __construct(globals $instance = null)
    {
        $this->_globalsInstance = $instance;
    }

    private function _getGlobals()
    {
        if (!$this->_globalsInstance instanceof globals)
        {
            $this->_globalsInstance = new globals();
        }
        return $this->_globalsInstance;
    }

    public function page()
    {
        return $this->_getGlobals()::$page;
    }
}

ただし、個人的には、このようには機能しません。インスタンスを必要な場所に渡すだけです(関数/メソッドへの引数として、またはアクセス可能なスコープでインスタンス化するだけです。

class globals
{
    public $page = null;//make this static, meaning all instances will share this var

    public function set_page($value)
    {
        $this->page = $value; // Maybe from a database
    }
}
$page = new globals();
$page->set_page('foobar');
someFunction($page);
$someObject->renderPage($page);
require_once('specificScript.php');
//inside required script:
echo $page->page;
于 2012-11-02T13:01:43.903 に答える
1

グローバル変数を使用する必要がありますか?

PHP5.3を使用できる場合はそうではありません

これは問題に対する正しいアプローチですか?

これにはジェネリッククラスを使用するか、オブジェクトの静的プロパティを使用することをお勧めします

<?php

class globals
{
    public static $page;

    public function __construct()
    {
    }

    public function set_page($value)
    {
        self::$page = $value; // Maybe from a database
    }
}

class get
{
    public static function page()
    {
        return globals::$page;
    }
}

$globals = new globals();
$globals->set_page('My value');

echo get::page(); // Short function to be in a template

PSしかし、これは良いアプローチではありません

于 2012-11-02T13:00:08.040 に答える
1

$globalsそこの

class get
{
    public function page()
    {
        $globals = new globals();
        return $globals->page;
    }
}

そしてそこに

$globals = new globals();
$globals->set_page('My value');

クラスの異なるinctancesですglobals

解決策の1つは、$pagevarを静的にすることです

public static $page;

これがお役に立てば幸いです

UPD:

また、新しいクラスを直接作成する代わりに、シングルトンをグローバルクラスに適用し、そのインセンスを要求することもできます。

globals::getInstance()->setPage('Page');

return globals::getInstance()->getPage();

この場合$page、静的である必要はありません。

于 2012-11-02T13:01:19.273 に答える
1

他の答えが非常に明確かどうかはわかりません。2つのクラスを作成しました。そのため、それらは異なるスコープを持っています。記述されているように、スコープ外にあるため、getクラスから元の変数$pageにアクセスすることはできません。実際、ページ関数は、$pageが設定されていないオブジェクト$globalsの新しいバージョンを作成します。通常、set関数とget関数の両方を最初のオブジェクト/クラスに配置します。2番目から最初のクラスを呼び出してページを設定することで2つのクラスを使用することは可能ですが。なぜあなたがそれをしたいのか私にはわかりません。

クラスを書いているとしたら、こんな感じになります。

class globals
{
    public $page;

    public function __construct()
    {
    }

    public function set_page($value)
    {
        $this->page = $value; // Maybe from a database
    }

    public function get_page()
    {
        return $this->page;
    }
}

実際、私はおそらくページをパブリックではなくプライベートに設定します。公開されているので、get関数は必要ないと思います。

于 2012-11-02T13:07:45.960 に答える
0

おそらく、これはあなたがあなたの粗野を続けるのを助けるでしょう:

     class globals
     {
        public static $page;

        public function set_page($value)
        {
           self::$page = $value; // Maybe from a database
        }
     }

    class get extends globals
   {
      public function page()
     {
        $globals = new globals();
        return parent::$page;
     }
   }

   $globals = new globals();
   $globals->set_page('My value');

   echo get::page();

?>

于 2012-11-02T13:16:13.213 に答える
0

オブジェクトなしでクラスのメソッドを使用するには、静的定義を使用する必要があります。しかしとにかく、あるクラスオブジェクトに値を付けて、別のクラスオブジェクトから取得しようとします...

于 2012-11-02T12:56:56.420 に答える