Explication sur function [Résolu]

Signaler
Messages postés
18
Date d'inscription
samedi 12 février 2005
Statut
Membre
Dernière intervention
10 octobre 2012
-
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
-
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

Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
12
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.
Messages postés
18
Date d'inscription
samedi 12 février 2005
Statut
Membre
Dernière intervention
10 octobre 2012

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.