функция php в функции - PullRequest
       1

функция php в функции

2 голосов
/ 08 марта 2012

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

Пример:

function email($val=NULL) {
    if($val) 
        $this->_email = $val;
    else 
        return $this->_email;
}

function fname($val=NULL) {
    if($val) 
        $this->_fname = $val;
    else 
        return $this->_fname;
} 

дляимя электронной почты и т. д.

, но я хочу, чтобы оно было таким:

function contr_val($key,$val) { 
    function $key($val=NULL) {
        if($val) 
            $this->_$key = $val;
        else 
            return $this->_$key;
    }
    function $key($val="hallo");
}

и вызывать его с помощью:

contr_val("email","test")

Ответы [ 5 ]

3 голосов
/ 08 марта 2012

Что вы ДЕЙСТВИТЕЛЬНО пытаетесь сделать, это динамически создавать переменные-члены и извлекать их значения. Это то, что __ get () и __set () предназначены для *.

Вот как это можно использовать:

class TestClass {
  var $data = array();

  public function __set($n, $v) { $this->data[$n] = $v; }
  public function __get($n) {
    return (isset($this->data[$n]) ? $this->data[$n] : null);
  }

  public function contr_val($k,$v = NULL) {
    if ($v) $this->$k = $v;
    else return $this->$k;
  }
};

$sherp = new TestClass;
$sherp->contr_val("Herp", "Derp");
echo "Herp is: " . $sherp->contr_val("Herp") . "\n";
echo "Narp is: " . $sherp->contr_val("Narp") . "\n";

** afuzzyllama побил меня до этого уровня , но я счел необходимым пример кода **.

2 голосов
/ 08 марта 2012

В массиве, полном имен функций, это вызывает каждую существующую функцию.

ghoti@pc:~$ cat functest.php 
#!/usr/local/bin/php
<?php

function one() { print "one\n"; }
function two() { print "two\n"; }
function three() { print "three\n"; }

$a=array( "one", "two", "three", "four" );

foreach ($a as $item) {
  if (function_exists($item)) {
    $item();
  } else {
    print "No such function: $item\n";
  }
}

ghoti@pc:~$ ./functest.php 
one
two
three
No such function: four
ghoti@pc:~$ 
2 голосов
/ 08 марта 2012

Если вы делаете это для класса, почему бы вам не рассмотреть использование магических методов PHP __get() и __set()?

2 голосов
/ 08 марта 2012

Вы имеете в виду что-то подобное?

/*
Input: $val - any value
$varname - the variable name, for instance: _email
*/
function checkValue($val=NULL , $varname) { 
    if($val) $this->$var = $val;
    else return $this->$var;
}

checkValue("hello" , "_email");
checkValue("hello2" , "_name");
0 голосов
/ 08 марта 2012

Необходимо проверить, существует функция или нет

function contr_val($key,$val) { 
    if (!function_exists($key)){
        function $key($val=NULL) {
            if($val) 
                $this->_$key = $val;
        }
    }else{ 
        return $this->_$key;
    }
}
...