Explication sur function

Résolu
philposer Messages postés 18 Date d'inscription samedi 12 février 2005 Statut Membre Dernière intervention 10 octobre 2012 - 17 janv. 2012 à 22:36
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 - 18 janv. 2012 à 20:26
Bonjour (bonsoir) à tous,

je viens de tomber sur quelque chose d'un peu particulier en analysant le framework fuel-php et malgré la doc PHP je ne comprend pas. Du coup j'ai besoin de vos explication afin de m'éclairer.

la partie de code de la class est le suivant:

	public static function forge(array $config = array())
{
return new static($config);
}


en fait la ligne que je ne comprend pas est le return new static?? comment peut-on faire un new d'un static qui n'est pas une class mais bien un mot protegé?

Merci pour vos explications

2 réponses

TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
18 janv. 2012 à 20:26
Salut,

En gros après quelques recherche ca revient à faire return new my_class()

C'est effectivement le cas, dans ce cadre là self permet de référer à la classe courrante (cf Late Static Bindings).

Donc pourquoi créer la class par "l'interieur" en faisant comme ca:
[...]
que plutôt utiliser un constructeur public et créer la class par "l'exterieur"

Comme ça je vois deux raisons. La première, qui se rencontre souvent mais n'est pas applicable dans le cas présent, est de faire un singleton. La seconde est de contourner certaines limitations de php 5.3 (la version 5.4 de php corrigera ce problème). Un exemple de limitation et l'utilisation de cette construction "externe" pour contourner :

<?php

class Toto
{
  public static function forge()
  {
    return new static();
  }

  public function foo()
  {
    return 42;
  }

  public function __toString()
  {
    return 'bar';
  }
}

//$val = new Toto()->foo();
$val = Toto::forge()->foo();

//echo 'Test: ' . new Toto() . PHP_EOL;
echo 'Test: ' . Toto::forge() . PHP_EOL;

?>

En commentaire ce que l'on souhaitais faire et qui ne fonctionne pas dans les versions antérieurs à 5.4 de php. Juste en dessous la manière de contourner.
3
philposer Messages postés 18 Date d'inscription samedi 12 février 2005 Statut Membre Dernière intervention 10 octobre 2012
18 janv. 2012 à 13:04
En gros après quelques recherche ca revient à faire
return new my_class()


Donc pourquoi créer la class par "l'interieur" en faisant comme ca:

<?php
class a
{
public $this->var = '';
protected function __construct($params)
{
$this->var = $params;
}

public static function create($params)
{
return new static($params);
}

$test = a::create('params');

?>


que plutôt utiliser un constructeur public et créer la class par "l'exterieur":

<?

$test = new a('params');

?>


je n'arrive pas à voir de différence et/ou avantage?? :-(

merci pour les éclaircissements.
0
Rejoignez-nous