Salut tout le monde.

Ma 1e question se porte dans l'exemple suivant:

public static function input($field, $value = null, array $attributes = array()) { ... }

A quoi correspond le array avant la viriable?
J'ai déjà vu ce type de truc mais jamais su a quoi ça correspondait.
comme par exemple:

public static function input(\Test $variable) { ... }

Ma 2e question c est sur le & devant une variable. A quoi correspond t il ?
exemple:

function demo(&$maVar) { ... }

3e question:
Peut on dire que:

array_key_exists('value', $attributes) and $attributes'value'] = '';

Pareil que:

array_key_exists('value', $attributes);
 $attributes'value'] = '';

Si NON pourriez vous de dire a quoi sert le AND alors ?

Voila merci d'avance

11 réponses


extrarox
Réponse acceptée

Salut,

Alors question 1:
C'est pour obligé, pour la fonction, a avoir à tous prix ce type de variable.
Exemple 1: si on ne donne pas d'array en paramètre, il y aura un Fatal Error
Exemple 2: idem mais on veut une instance de class Blabla

Question 2:
Ceci s'appelle passer une variable par référence, en gros si tu fais :

function test1($var){ $var++; }
function test2(&$var){ $var++; }
$lavar = 2;
test1($lavar);
echo $lavar;//Retourne 2
test2($lavar);
echo $lavar;//Retourne 3

Pour faire simple, dans la première fonction, la variable est une copie faite juste pour la fonction.
Dans l'autre on utilise réellement celle de l'extérieur.
Bon c'est plus compliqué que ça mais pour faire simple, voilà.

Question 3:
Je dirai que c'est la même chose, mais présenté comme ça c'est se faire chier pour rien^^

Salut sauf erreur de ma part (je suis autodidacte depuis +/- 6mois) je pense pouvoir dire sans me tromper (si des pros passent, qu'il corrigent les erreurs):

  1. il s'agit de s'assurer que l'argument reçu est bien du type spécifié. Tu aura donc une erreur fatal si tu fais par exemple:

    $test = 1; //variable de type intier (instance de int)
    function essais( array $var)
    {
    // function
    }
    essais($test)

en effet, le paramètre attendu est de type array alors que tu passes un int

  1. le petit & devant la variable dans le argument permette de passer l’élément par référence et non par valeur. En fait quand tu envois une valeur à une fonction PHP copie la valeur pour la fonction et si tu modifies la valeur dans la fonction, la valeur hors fonction ne sera pas modifiée. Tandis que lorsque tu mets le petit &, c'est le pointeur vers la variable que tu donne à la fonction. regarde les deux exemple ci-dessous:

sans le & dans la définition de la fonction

<?php
$test = 'essais';
function test( $var)
{
    $var = 'variable modifiee';
}
test($test);
echo $test; //renvoi essais

alors que avec le petit &

<?php
$test = 'essais';
function test( $var)
{
    $var = 'variable modifiee';
}
test($test); //renvoi: 'variable modifieee'
echo $test;
  1. A mon avis tu as une erreur dans

    $attributes'value'] = '';

    en effet tu compares si la clef est dans le tableau ET qu'elle vaut '' mais fait attention:

    $var = ''

est différent de

$var == ''

si = tu assignes la valeur à la variable
si == tu vérifies que la variable à la valeur

donc tu devrais avoir un double égal

array_key_exists('value', $attributes) and $attributes'value'] == '';

ce qui montre que c'est différent

Mikachu
Auteur

Génial pour les questions 1 et 2... merci bop

donc si je fais:

function demo(array $data=null) { ... }

ça pourrait le faire et donc $data serait obligatoirement un tableau mais optionnel? pas obligé de mettre un paramètre a demi() ?

pour la 3 philposer le soucis c est que ce n est pas une condition.

je copie la fonction ou y a ça:

public static function forge($fieldset = 'default', array $config = array())
    {
        if (is_string($fieldset))
        {
            ($set = \Fieldset::instance($fieldset)) and $fieldset = $set;
        }
        if ($fieldset instanceof Fieldset)
        {
            if ($fieldset->form(false) != null)
            {
                throw new \DomainException('Form instance already exists, cannot be recreated. Use instance() instead of factory() to retrieve the existing instance.');
            }
        }
        return new static($fieldset, $config);
    }

Si quelque un peut m'expliquer le AND dans:

($set = \Fieldset::instance($fieldset)) and $fieldset = $set;

Pour la fonction demo tu as tout compris^^

Alors pour le And:
Déjà ce que tu as donné comme exemple tout à l'heure et ça, ça n'a rien à voir.
L'explication du AND en premier, la première opérande est testé, si c'est bon, on lit la deuxième opérande, sinon on ne cherche même pas à la voir.
Du coup, tu as une création de Singleton que l'on mets dans $set, si elle existait déjà ça retourne surement false, donc le reste n'est pas fait. Mais si c'est créé, ça ira après le "and" et ça mettra le $set dans $fieldset.

Je vois que cette explication.

Mikachu
Auteur

Oki donc pour toi ça reviendrai a dire:

if($set == \Fieldset::instance($fieldset)) {
    $fieldset = $set;
}

c est ça?

1) on appel ça le type hinting : http://php.net/manual/fr/language.oop5.typehinting.php
2) C'est une référence : http://php.net/manual/fr/language.references.php
3) c'est une opération logique : http://www.php.net/manual/fr/language.operators.logical.php

La doc est le meilleur endroit pour trouver des réponses précises, si tu comprends pas la doc là c'est un autre problème.

Non pas de "==", juste "="

Mikachu
Auteur

darkalex : Merci pour les liens. Je pouvais pas réellement chercher, je ne savais pas quoi ou comment faire une recherche sur une chose que je connais pas. C est pas faute d'avoir essayé en tapant du style type devant variable etc.... mais sans succès.
le & c'était pour avoir une explication un peu plus precise. Je captais pas trop, Mais maintenant oui.
Pour le 3 je m en doutais que c était un opérateur logique, mais je connaissais pas cette forme la sur une ligne avec un opérateur. Du coup je cherchais une explication concrète avec un exemple concret.

:)

@extrarox donc les façons sont identique ?

Bref, merci pour vos explication sympa :)

Oui mais plus lourds et il y a peut être un subtilité, mais je vois vraiment pas laquelle.

Mikachu
Auteur

oui merci pour tout en cas

l'astuce du and c'est un problème de priorité : http://php.net/manual/fr/language.operators.precedence.php