2010-06-23 12 views
4

Ive regardé et essayé, mais je ne trouve pas de réponse.méthode de classe appelant (avec constructeurs) sans l'instanciation de l'objet dans php

En PHP, est-il possible d'appeler une fonction membre de classe (quand cette classe nécessite un constructeur pour recevoir des paramètres) sans l'instancier en tant qu'objet?

Un exemple de code (ce qui donne des erreurs):

<?php 

class Test { 
    private $end=""; 

    function __construct($value) { 
     $this->end=$value; 
    } 

    public function alert($value) { 
     echo $value." ".$this->end; 
    } 
} 

//this works: 
$example=new Test("world"); 
$example->alert("hello"); 

//this does not work: 
echo Test("world")::alert("hello"); 

?> 
+0

Je pensais test d'écho :: __ construct ("monde") :: alert ("bonjour"); peut fonctionner mais ne le fait pas, soupirer – mykchan

+0

en alertant() à une fonction statique fera le travail. –

Répondre

0

Vous ne pouvez pas appeler une méthode de niveau instance sans une instance. Votre syntaxe:

echo Test("world")::alert("hello"); 

ne fait pas beaucoup de sens. Soit vous créez une instance en ligne et vous l'annulez immédiatement, soit la méthode alert() n'a pas d'instance implicite this.

Supposant:

class Test { 
    public function __construct($message) { 
    $this->message = $message; 
    } 

    public function foo($message) { 
    echo "$this->message $message"; 
    } 
} 

vous pouvez faire:

$t = new Test("Hello"); 
$t->foo("world"); 

mais la syntaxe PHP ne permet pas:

new Test("Hello")->foo("world"); 

qui serait autrement l'équivalent. Il y a quelques exemples de ceci en PHP (par exemple en utilisant l'indexation de tableau sur un retour de fonction). C'est comme ça.

+1

Je crée une instance en ligne et je la rejette immédiatement. Je ne vois pas pourquoi j'ai besoin d'allouer une variable à ce processus ... est-ce juste comme PHP/OOP est? – mykchan

18

Malheureusement PHP n'a pas le soutien pour ce faire, mais vous êtes un créatif et regarder gars: D

Vous pouvez utiliser une « usine », exemple:

<?php 

class Foo 
{ 
    private $__aaa = null; 

    public function __construct($aaa) 
    { 
     $this->__aaa = $aaa; 
    } 

    public static function factory($aaa) 
    { 
     return new Foo($aaa); 
    } 

    public function doX() 
    { 
     return $this->__aaa * 2; 
    } 
} 

Foo::factory(10)->doX(); // outputs 20 
1

Moi aussi, était à la recherche d'un one-liner pour accomplir cela dans le cadre d'une seule expression pour convertir des dates d'un format à un autre. J'aime faire cela dans une seule ligne de code car c'est une seule opération logique. Donc, c'est un peu cryptique, mais il vous permet d'instancier et d'utiliser un objet date dans une seule ligne:

$newDateString = ($d = new DateTime('2011-08-30') ? $d->format('F d, Y') : ''); 

Une autre façon d'une ligne la conversion des chaînes de date d'un format à l'autre est d'utiliser un fonction aide pour gérer les parties OO du code:

function convertDate($oldDateString,$newDateFormatString) { 
    $d = new DateTime($oldDateString); 
    return $d->format($newDateFormatString); 
} 

$myNewDate = convertDate($myOldDate,'F d, Y'); 

Je pense que l'approche orientée objet est cool et nécessaire, mais il peut parfois être fastidieux, nécessitant trop d'étapes pour accomplir des opérations simples.

4

Il suffit de faire cela (en PHP> = 5.4):

$t = (new Test("Hello"))->foo("world");