4

名前空間内で定数を宣言したい。もちろん、外に見えないようにしたいです。

define() を使用すると、実行される名前空間に関係なく定数がグローバルになるため、機能しません (よく理解していれば)。

だから私はすることができます:

namespace paths;

const models  = 'Models/';
const views   = 'Views/';
const classes = 'Classes/';

そして他の場所:

require_once(paths\models.'user.php'); // works
require_once(models.'user.php');       // fails

また、もしそうなら:

namespace ns;
namespace subNs;

私は ns\subNs にいますか、それとも subNs にいますか?

PS: require_once('Models/user.php'); を実行していることは知っています。より簡単になりますが、これは単なる例です。

4

3 に答える 3

4

広告 1. はい、できます。サンプルスクリプトを実行して確認できます。(ただし、最初に\paths\constantorを使用する必要がある場合があります)use paths;

Ad 2. subNs で確認できますecho __NAMESPACE__;

于 2012-11-28T00:12:17.787 に答える
1

define を使用して、次のように名前空間定数を宣言できます。

<?php namespace paths;
// Preferred way in a file that does not declare the namespace:
define('paths\\models', 'Models/');
define('paths\\views', 'Views/');
define('paths\\classes', 'Classes/');

// Preferred way in file with the namespace declared:
const models  = 'Models/';
const views   = 'Views/';
const classes = 'Classes/';
?>

PHP 5.6 では、「use」キーワードを使用して定数を自動ロードできます。こちらを参照してください: http://php.net/manual/en/migration56.new-features.php

于 2014-08-09T14:21:13.963 に答える
1

やりたいことはできません。

あなたがしたくないと述べたように定義されている場合、require関数で定数「モデル」を使用できる唯一の方法です。

これを行うクラスを作成してみませんか?

<?php
class PATHS {

    public $models = null;
    public $views = null;
    public $classes = null;

    public function __construct($namespace) {

         switch ($namespace) {
            case 'path1' :
                $this->models = 'my_custom_path/models';
                $this->$views = 'my_custom_path/views';
                $this->classes = 'my_custom_path/classes';
             break;
             case 'path2' :
                $this->models = 'my_custom_path/models';
                $this->$views = 'my_custom_path/views';
                $this->classes = 'my_custom_path/classes';
             break;
             default :
                $this->models = 'my_custom_path/models';
                $this->$views = 'my_custom_path/views';
                $this->classes = 'my_custom_path/classes';
             break;
         }

    }

}

$paths =new PATHS('my_namespace');

echo $paths->models;
echo $paths->views;
echo $paths->classes;

?>

私はあなたの最終目標が何であるかを完全には理解していませんが、私はそれの要点を理解していると思います.オブジェクトに変換された同様のクラスは、あなたが望むものを達成するはずです.

必要に応じて、そのクラスをフレームワークに簡単に含めることができます。

それが役立つことを願っています

于 2012-11-28T00:14:44.953 に答える