2014-01-20 6 views
-2
function set_firstname($firstname){ 
// some code here 
} 
function fullname($lastname){ 
$firstname = set_firstname(); 
return $firstname." ".$lastname; 
} 
set_firstname("Rajesh"); 
echo fullname("Dhar");   // Rajesh Dhar 
echo fullname("Basu");   // Rajesh Basu 
echo fullname("Niyogi");  // Rajesh Niyogi 
set_firstname("Sharmila"); 
echo fullname("Sen");   // Sharmila Sen 
echo fullname("Chatterjee"); // Sharmila Chatterjee 
echo fullname("Pal");   // Sharmila Pal 

Как определить функцию set_firstname, чтобы приведенный выше код работал правильно?Как изменить значение по умолчанию функции с помощью другой функции?

+0

Будет ли кто-нибудь, пожалуйста, скажите мне, для чего нужны downvotes? –

+1

Несмотря на то, что я не проголосовал: вопрос SO должен проявлять усилия с вашей стороны (будь то исследования или попытки кодирования), которые показывают, что вы на самом деле _tried_, чтобы получить то, что вам нужно. Вы просто показываете 2 функции, один из них пуст - из-за комментария '// code here', и, в основном, спрашивайте _« Какой код я могу здесь сделать для этого »_..., который мало что показывает в способ усилий, который вы, возможно, предприняли –

ответ

1

Update:
Казалось бы, что вы ищете способ влияния/изменить поведение функции, в том же образом date_default_timezone_set влияет на поведении date функций поперек доска. Ответ на это довольно прост: вы не можете ... на самом деле. Функции, о которых вы думаете, на самом деле не изменить другие функции. Они меняют runtime (ini настройки и т. П.), И это runtime, что другие функции используют для вычисления их соответствующих возвращаемых значений.
Подумайте об date_default_timezone_set Как добраться на самолете: вы можете лететь в часть мира, расположенную в другом часовом поясе, и ваши биологические часы будут адаптированы (через некоторое время) к этому другому часовому поясу, вы даже установите свой часы по-разному. Но ваш дом, ваш день рождения и все остальное не меняются. Место, где вы находитесь в любой момент времени, является вашим «runtime», и оно подвержено изменениям. Эти изменения могут привести к себя/по-разному реагируют, но они на самом деле не изменится, кто вы ...

используя обычные функции, вы могли бы использовать static переменные:

function firstname($name = null) 
{ 
    static $return = 'Default'; 
    $return = $name ? $name : $return; 
    return $return; 
} 
function fullName($name) 
{ 
    return firstname().' '.$name; 
} 
//test: 
echo fullName('foobar');//echoes Default foobar 
firstname('Mr. '); 
echo fullName('foobar');//echoes Mr. foobar 

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

function fullName($first, $last) 
{ 
    return $first.' '.$last; 
} 

Но тогда, зачем использовать функцию вообще?
В более общих чертах вы на самом деле ищете способ связать состояние с функциональностью. Как повезло: классы делают именно это (пара данных с методами). «лучше» или более логичный подход, то был бы:

class Name 
{ 
    protected $firstName = null; 
    protected $lastName = null; 
    public function __construct($first = 'Default', $last = null) 
    { 
     $this->firstName = $first; 
     $this->lastName = $last; 
    } 
    public function getFullName($last = null, $first = null) 
    { 
     if ($last) $this->lastName = $last; 
     if ($first) $this->firstName = $first; 
     return $first.' '.$last; 
    } 
} 

Дополнительным преимуществом классов здесь, хотя я не включил это в моем примере, является то, что вы можете проверки значения которые передаются методам, и вы можете отфильтровать недопустимый ввод. такие вещи, как is_string, проверка правильности, filter_var звонки и т. п. ...
Добавьте к этому, что, по мере роста вашего проекта, вы можете легко освоить данный класс, например добавить свойство protected $email = null, а также сеттер, который выполняет filter_var($email, FILTER_VALIDATE_EMAIL), чтобы убедиться, что действительный адрес электронной почты установлен, и у вас есть себе хороший маленький контейнер данных, который может хранить всевозможные данные, относящиеся к человеку, так как он представлен в вашей БД и используется по остальной части вашего кода.

+0

Мой вопрос: «Как изменить значение по умолчанию для функции с помощью другой функции?» Я мог бы привести «date_default_timezone_set' или« imagesetthickness »в качестве примеров, но рискнул (глупо, теперь я вижу) создать свои собственные примеры, чтобы никто здесь помещает мой вопрос из-за отсутствия кода. Я обещаю, что в своей жизни я не буду использовать такие функции, как 'set_firstname' или' fullname' _anywhere_. –

+0

@SoumalyoBardhan: Ответ на это просто: вы не можете. 'date_default_timezone_set' не изменяет возвращаемое значение любой из функций' date'. Он изменяет настройку среды выполнения, из которой другие функции получают данные, которые им нужны, для вывода их продукции. Зависимые функции возвращают результат вычисления, вход для этого вычисления извлекается из комбинации настроек системы + ini. Это те 'ini', которые вы можете изменить, сами функции остаются прежними. Ближе всего вы можете получить экземпляры 'ReflectionClass' –

+0

@SoumalyoBardhan: отредактировал мой ответ, объяснив, какая разница между пользовательскими функциями и функциями, использующими среду выполнения, для возврата заданных значений –

1
function set_firstname($name = "") { 
    static $_name; 
    if($name != "") { 
     $_name = $name; 
    } else { 
     return $_name; 
    } 
} 

Наверное, я должен признать, что это действительно плохой стиль кодирования. (мое мнение)

+0

Почему вы называете это «действительно плохой стиль кодирования»? Я думаю, что такие функции, как 'date_default_timezone_set' и' imagesetthickness', структурированы аналогичным образом. –

+0

Я сам предпочитаю классы, потому что тогда мы ясно указываем, что он может содержать переменные. Функция вместо этого ничего не должна хранить, но это только мое мнение. – henje

1

Вы должны использовать классы, в которых вы можете сохранить переменную, принадлежащую этому классу. Например,

class Person 
{ 
    protected $_Firstname; 
    protected $_Lastname; 

    public function __construct($firstname, $lastname) 
    { 
     // set the initial first- and lastname 
     $this->_Firstname = $firstname; 
     $this->_Lastname = $lastname; 
    } 

    public function __toString() 
    { 
     return sprinft("%s %s", $this->_Firstname, $this->_Lastname); 
    } 

    public function SetFirstname($value) 
    { 
     $this->_Firstname = $value; 
    } 
} 

// create a new instance of a person 
$p = new Person("Rajesh", "Dhar"); 

echo $p; // will display: "Rasjeh Dhar" 

$p->SetFirstname("Sharmila"); 

echo $p; // will display: "Sharmila Dhar" 
0
$first_name = ''; 

function set_firstname($firstname){ 
    global $first_name; 
    $first_name = $firstname; 
} 

function fullname($lastname){ 
    global $first_name; 
    return $first_name ." ".$lastname; 
} 
+0

Вы забываете использовать «глобальную» в обеих функциях. – Pakspul

+0

Да. Исправлена. Благодарим вас за уведомление. – Hassan

+1

Ouch ... В своем ответе я сказал, что «статичная» - это уже плохая идея ... использование «global» is, IMHO, еще хуже: если эта переменная уже глобальна, почему бы вам даже не использовать 'fullname', а не просто использовать' $ fullname = $ first_name. ' '$ lastname; 'без вызова функции? –

Смежные вопросы