別のクラスの定数としてクラス[datetime( '@-1')]のphpオブジェクトインスタンス
-
27-10-2019 - |
質問
私は、プロパティの1つとしてDateTimeオブジェクトを持つクラスを定義しています。デフォルト値を「-1」のUNIXタイムスタンプに設定したいと思います。また、すべてのオブジェクトがその値を知るように、このデフォルト値を一定にしたいと思います。
しかし、私は次のようなものを宣言したくありません const PROPERTY_DEFAULT_DATE = '-1';
プロパティはこのデフォルト値を使用してDateTimeオブジェクトと操作/関数であり、Property_Default_Dateが適切なDateTimeオブジェクトでない場合、プロパティを処理が困難になります。
それでは、クラスの特定のオブジェクトインスタンスを別のクラス内に一定として入れることはできますか?
PHPマニュアルには言います
値は、変数、プロパティ、数学的操作の結果、または関数呼び出しではなく、一定の式である必要があります。
これについては言及していませんが、私はそれができないと思います(多くのバリエーションを試してみて、常に構文エラーを取得しました)
不可能な場合、どのような選択肢がありますか?
編集:「デフォルト値」を自分のプロパティに定義する問題の解決策を見つける必要があると思います。この場合、これはたまたまDatetimeオブジェクトです。
デフォルト値はどのようなものですか あなた に設定されています
__construct()
? (いいえ、ヌルではありません、もっとエレガントなソリューションが存在する必要があると思います)また、クラス/サブクラス内の操作/機能で使用できることにも留意してください更新:私はここでアドバイスに従い、
private $_DEFAULT_DATE
プロパティとそれのためのゲッター。このプロパティにはセッターがないので、変更されないことを確信できます。 (もちろん、クラスの実装内で変更しないように注意してください)
解決
まあ、残念ながら、マニュアルは正しいです。オブジェクトを定数に配置することはできません。あなたはそれをプロパティにすることができます、またはあなたの場合、静的関数が適しているかもしれません。
YourClass::getDefaultDate(); // return DateTime('-1');
他のヒント
不可能です。最も簡単な代替品は、静的プロパティを使用することですが、このプロパティが変更されないようにしたいと思うようです。
したがって、この場合、これを行う唯一の論理的な方法は、静的プロパティをプライベートにすることであり、DateTimeオブジェクトを返す静的関数を追加することです。
しかし、私はまだあなたが特異なオブジェクトを使用したいとは思わない。他のメソッドがこのデフォルトオブジェクトを要求する場合、彼らはそれを変更することができ、奇妙な結果が得られる可能性があります。この方法(私の頭の中で)への要求は、新しいまたはクローン化されたDateTimeオブジェクトを受信する必要があります。
マニュアルは正しいです:いいえ、でオブジェクトを使用することはできません const
PHPの式。
この方法で使用する場合は、コンストラクター内の適切なメンバーを初期化する必要があります。あなたがそれを変更できないようにしたいなら、 一定の努力で、あなたはそれをそうすることができます.
php.netから Sonstantの構文と使用について誰かが定数への「動的な」割り当てについて話しました。何?定数への動的な割り当てはありません、ランタイム割り当ては機能します それだけ 変数付き。提案された例を見てみましょう:
<?php
/**
* Constants that deal only with the database
*/
class DbConstant extends aClassConstant {
protected $host = 'localhost';
protected $user = 'user';
protected $password = 'pass';
protected $database = 'db';
protected $time;
function __construct() {
$this->time = time() + 1; // dynamic assignment
}
}
?>
それらは定数ではなく、クラスのプロパティです。 「this-> time = time()」のようなものは、定数の目的を完全に無視します。定数は、すべての実行で一定の値だけであると想定されています。スクリプトが実行されるか、クラスがインスタンス化されるたびに変更することは想定されていません。
結論:変数として定数を再発明しようとしないでください。定数が機能しない場合は、変数を使用してください。そうすれば、すでにそこにあるもののために物事を達成するために方法を再発明する必要はありません。
自己から:プライベートな静的方法を使用して、魔法の方法を使用して__GETSTATIT(AvaliaBlrがPHP 5.3からのみ)か、Simple __GetとProperty_Existを使用するか、リフレクションを使用します。しかし、実際には、この解決策が必要な問題はありません。ごめん ((