. . . und natürlich möchte ich, dass $value die Nummer 14 zugewiesen wird. Ist das möglich?
Aktualisieren: Es funktioniert nicht (Sie können “selbst” nicht zurückgeben – es ist keine Instanz!), aber meine Gedanken haben mich hierher geführt:
class TestClass {
public static $currentValue;
public static function toValue($value) {
self::$currentValue = $value;
}
public static function add($value) {
self::$currentValue = self::$currentValue + $value;
return self;
}
public static function subtract($value) {
self::$currentValue = self::$currentValue - $value;
return self;
}
public static function result() {
return self::$value;
}
}
Nachdem ich das herausgefunden habe, denke ich, dass es einfach sinnvoller wäre, einfach mit einer Klasseninstanz zu arbeiten, anstatt zu versuchen, statische Funktionsaufrufe zu verketten (was nicht möglich erscheint, es sei denn, das obige Beispiel könnte irgendwie optimiert werden).
Mathew Byrne
Ich mag die oben von Camilo bereitgestellte Lösung, da Sie im Wesentlichen nur den Wert eines statischen Elements ändern und da Sie eine Verkettung wünschen (obwohl es nur syntaktischer Zucker ist), ist die Instanziierung von TestClass wahrscheinlich der beste Weg .
Ich würde ein Singleton-Muster vorschlagen, wenn Sie die Instanziierung der Klasse einschränken möchten:
class TestClass
{
public static $currentValue;
private static $_instance = null;
private function __construct () { }
public static function getInstance ()
{
if (self::$_instance === null) {
self::$_instance = new self;
}
return self::$_instance;
}
public function toValue($value) {
self::$currentValue = $value;
return $this;
}
public function add($value) {
self::$currentValue = self::$currentValue + $value;
return $this;
}
public function subtract($value) {
self::$currentValue = self::$currentValue - $value;
return $this;
}
public function result() {
return self::$currentValue;
}
}
// Example Usage:
$result = TestClass::getInstance ()
->toValue(5)
->add(3)
->subtract(2)
->add(8)
->result();
public function result() { return $this::$value; } soll diese Linie sein public function result() { return $this::$currentValue; } ????
– Val
14. Januar 10 um 14:16 Uhr
Dies funktioniert nicht, sobald Sie mehr als eine zusammen verwenden möchten. $a = TestClass::getInstance()->toValue(3)->add(5);$b = TestClass::getInstance()->toValue(7)->add($a->result());echo $b->result(); Sie erhalten 14 statt 15. Gehen Sie mit Geld nicht mit dieser Mathematik um.
– Glenn Moss
13. Juni 11 um 22:56 Uhr
Die Konstruktordefinition private __construct () { } sollte sein private function __construct () { }. Ebenfalls, return $this::$currentValue; sollte sein return self::$currentValue;.
– Glenn Moss
13. Juni 11 um 22:59 Uhr
Ich habe auch festgestellt, dass dies keine Methode verkettet. Auch dies funktioniert nicht, wenn Sie das Schlüsselwort verwenden final auf deine Klasse.
– Kevin Beal
15. Januar 14 um 20:56 Uhr
Ariful-Islam
class oop{
public static $val;
public static function add($var){
static::$val+=$var;
return new static;
}
public static function sub($var){
static::$val-=$var;
return new static;
}
public static function out(){
return static::$val;
}
public static function init($var){
static::$val=$var;
return new static;
}
}
echo oop::init(5)->add(2)->out();
Ich denke, wenn es um die Syntax geht (nicht um die besten Codierungspraktiken), ist dies die beste Antwort auf diese Frage.
– nmirceac
26. Januar 20 um 10:19 Uhr
Dieser Antwort fehlt ihre pädagogische Erklärung.
– mickmackusa
28. November 20 um 21:02 Uhr
wirkt sich das auf die leistung aus?
– fdrv
6. Dezember 21 um 2:58 Uhr
Kleiner verrückter Code auf php5.3 … nur zum Spaß.
namespace chaining;
class chain
{
static public function one()
{return get_called_class();}
static public function two()
{return get_called_class();}
}
${${${${chain::one()} = chain::two()}::one()}::two()}::one();
class OopClass
{
public $first;
public $second;
public $third;
public static function make($first)
{
return new OopClass($first);
}
public function __construct($first)
{
$this->first = $first;
}
public function second($second)
{
$this->second = $second;
return $this;
}
public function third($third)
{
$this->third = $third;
return $this;
}
}