Передача глобальных переменных и аргументов в функцию в PHP - PullRequest
2 голосов
/ 12 августа 2011

Привет и спасибо, что были там,

Я хотел бы передать переменную ($user) из предыдущей функции в другую, но мне нужно использовать аргументы новой функции для передачи значений, которые будут отображать эту новую.

Есть ли способ передать переменную из другой функции в новую функцию, которая ожидает только три аргумента, и ни один из них не является переменной из предыдущей функции?

Пример:

function my_function($country, $age, $colour) {
  if ($user = true) {
    echo "User is from " . $country . " and " . $age . " and his favourite colour is " . $colour; 
  }
}

my_function("italy", 19, "red");

Это работает, если я помещу в функцию my_function:

global $user;

но я считаю, что использование глобальных переменных не очень хорошая практика.

Есть идеи, как передать это в качестве аргумента? Должен ли я просто добавить его в качестве другой переменной после $colour в аргументах новой функции?

Большое спасибо за вашу помощь:)

Ответы [ 4 ]

3 голосов
/ 12 августа 2011

Вы можете передать его в качестве аргумента, или лучше сделать это:

if ($user) my_function("italy", 19, "red");

, поскольку вам не нужно использовать переменную $user внутри этой функции.

1 голос
/ 12 августа 2011

Вы можете использовать эту функцию, но передовой практикой будет использование класса.Т.е. если вы вызовете my_function ("italy", 19, "red"), $ user будет иметь значение false по умолчанию

function my_function($country, $age, $colour, $user=false) {
if ($user == true) {
echo "User is from " $country . "and " . $age . " and his favourite colour is " . $colour; 
}
}

my_function("italy", 19, "red",true);
0 голосов
/ 12 августа 2011

Если ваша предыдущая функция выглядит примерно так:

/**
 * Callback function for so_user_data() that tells if we want to give you info about the user or not.
 * @param (string) $user | Accepts a Username as input
 * @return (boolean) | true if the User is 'Rob'
 */
function so_user_fn( $user )
{
    $allowed_users = array(
         'Rob'
        ,'Jay'
        ,'Silent Bob'
    );
    if ( in_array $user, $allowed_users ) )
        return true;
    // false if not 'Rob'
    return false;
}

/**
 * Shows the country, age & fav. colour of a user or denies displaying this information
 * if the user is not a public v.i.p. or someone other we want to give you info about.
 * @uses so_user_fn() | used to determine if the user is 'Rob'
 * @param (string) $user | Username
 * @param (string) $country | (optional) Country of origin
 * @param (integer) $age | (optional) Age of the user
 * @param (string) $colour | (optional) Fav. Colour
 */
function so_user_data( $user, $country = 'an unknown country', $age = 'unknown', $colour = 'not known' )
{
    $output = "$user is from {$country} and {$age} years old. His favourite colour is {$colour}.";

    // Only print the output if the user is 'Rob'
    if ( so_user_test( $user ) )
        return print $output;

    return print 'We are not allowed to give you information about this user.';
}

Вы можете назвать ее так:

so_user_data( 'Fancy Franzy' );
// outputs: We are not allowed to give you information about this user.

so_user_data( 'Rob' );
// outputs: Rob is from an unknown country and unknown years old. His favourite colour is not known.

so_user_data( 'Silent Bob', 'U.S.A.', '38', 'brown' );
// outputs: Silent Bob is from U.S.A. and 38 years old. His favourite colour is brown.
0 голосов
/ 12 августа 2011

Что ж, глобальные переменные - это плохая практика, но в вашем случае она жизнеспособна.

Я бы определенно рекомендовал вам изучить / использовать объектно-ориентированный подход.

На самом делемножество разных способов добиться того, что вы пытаетесь.

Один из способов - это инкапсуляция вашего кода в объект.

<?php

class My_Cool_Class {
    public $user = false;

    public function myFunction($country, $age, $color) {
        if ($this->user)
        echo "User is from {$country} and {$age} years old and his favourite colour is {$color}"; 
    }
}

$class = new My_Cool_Class();
$class->user = new User();
$class->myFunction("Italy", 19, "red");

Или вы можете реализовать шаблон Singleton, чтобы легко получить доступ к вашемуобъект / функции из любого места.

<?php

class My_Cool_Class {
    public $user = false;

    protected static $_instance;

    public function getIntance() {
        if(!self::$_instance)
            self::$_instance = new self();

        return self::$_instance;
    }

    public function setUser($user) {
        $this->user = $user;
    }

    public function myFunction($country, $age, $color) {
        if ($this->user)
            echo "User is from {$country} and {$age} years old and his favourite colour is {$color}"; 
    }
}


//Set User from anywhere with this
My_Cool_Class::getInstance()->setUser($user);


//Call your function anywhere with this.
My_Cool_Class::getInstance()->myFunction("Italy", 19, "red");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...