Explication sur function [Résolu]

philposer 18 Messages postés samedi 12 février 2005Date d'inscription 10 octobre 2012 Dernière intervention - 17 janv. 2012 à 22:36 - Dernière réponse : TychoBrahe 1310 Messages postés samedi 31 janvier 2009Date d'inscription 5 juin 2013 Dernière intervention
- 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
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
TychoBrahe 1310 Messages postés samedi 31 janvier 2009Date d'inscription 5 juin 2013 Dernière intervention - 18 janv. 2012 à 20:26
3
Merci
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.

Merci TychoBrahe 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 83 internautes ce mois-ci

Commenter la réponse de TychoBrahe
philposer 18 Messages postés samedi 12 février 2005Date d'inscription 10 octobre 2012 Dernière intervention - 18 janv. 2012 à 13:04
0
Merci
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.
Commenter la réponse de philposer

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.