PHP: 関数処理関数(funchand) - Manual
PHP  
downloads | documentation | faq | getting help | mailing lists | | php.net sites | links | my php.net 
search for in the  
<ftp_systypecall_user_func_array>
view the version of this page
Last updated: Tue, 21 Dec 2004

XXXVIII. 関数処理関数(funchand)

導入

これらの関数は、関数で行う様々な処理を行います。

要件

これらの関数は、標準モジュールの一部として利用可能であり、常に使用できます。

インストール手順

これらの関数はPHPコアに含まれるため、使用す る際にインストールは不要です。

実行用の設定

この拡張モジュールは設定ディレクティブを全く定義しません。

定義済みの定数

この拡張モジュールは定数を全く定義しません。

目次
call_user_func_array --  パラメータの配列を指定してユーザ関数をコールする
call_user_func --  最初の引数で指定したユーザ関数をコールする
create_function -- 匿名関数(ラムダ形式)を作成する
func_get_arg -- 引数のリストから要素を1つ返す
func_get_args -- 関数の引数リストを配列として返す
func_num_args -- 関数に渡された引数の数を返す
function_exists --  指定した関数が定義されている場合にTRUEを返す
get_defined_functions --  定義済みの全ての関数を配列で返す
register_shutdown_function -- シャットダウン時に実行する関数を登録する
register_tick_function --  各tickで実行する関数を登録する
unregister_tick_function --  各tickの実行用の関数の登録を解除する


add a note add a note User Contributed Notes
関数処理関数(funchand)
michael dot bommarito at gmail dot com
30-Jan-2005 07:28
I've developed an easy-to-use hack using these functions to emulate overloaded functions.  It's especially handy for constructors and/or C++ style templating.

Here's a little example to get you going.  This does the trick for most circumstances, and if you need more intelligent parsing, it's not too hard to implement with regex or a more suitable classification scheme.

N.B. Note the lack of whitespace between variable types in case strings.

class Matrix {

...

function Matrix() {
  $args = func_get_args();
  $argmatch = implode(",", array_map('gettype', $args));

  switch( $argmatch ) {
   case 'integer,integer':
     //initialize m x n matrix
     break;

   case 'integer,integer,integer':
     //initialize m x n matrix with constant c
     break;

   case 'integer,integer,float':
     //initialize m x n matrix with constant c
     break;   

   case 'array':
     //initialize from array (2D....)
     break;

   case 'array,integer':
     //intialize from array (1D packed with m rows)
     break;
  
   default:
     //(void) overload?
     //error handling?
     break;
  }
}

...

}
php-note-2003-june-18 at ryandesign dot com
18-Jun-2003 03:22
Xavier's example is rather complicated, and his task would be much more simply accomplished by using classes. Define a base class to do the basic functions open, dump, and close, and create extension classes to override whatever behavior.

class foo {
  function open() {
   // Default functionality for open()
  }
  function dump() {
   // Default functionality for dump()
  }
  function close() {
   // Default functionality for close()
  }
}

class bar extends foo {
  function open() {
   // Override functionality of open()
  }
  // dump() and close() remain as in class foo
}
xmontero at dsitelecom dot com
23-Aug-2002 09:49
You can do some kind of overloading functions in PHP using "function_exists".

Let's suppose you want a script to call plugins that are php files and you want the plugins to "override" behaviours that if not overriden are used by default.

You might for example write a "mySQL table viewer" which displays a table and it "opens a table", "dumps the header", "dumps row-by-row" and then "closes the table".

Let's suppose you want a plugin for "Stocks" which prints negative stocks in red, so you want to override the "dumping row-by-row" to do that behaviour. Instead you do not want to have all the "default behaviour" repeated in the plugin.

You may then do the following:

1) Define a default plugin (ex: "default.php"

2) Write all your functions in default.php to open, dump and close, but add them a suffix:

open_table_default()
dump_header_default()
dump_row_default()
close_table_default()

3) Call your functions with a wrapper: Insetad of this:
open_table() or open_table_default() write this:

plugincall("open_table");

4) Then write a function called plugincall which uses function_exists() to see if you call one or the other function:

function plugincall($desired_function_name)
{

if( function_exists( $desired_function_name))
{
   //Call the plugin
   //Note the $ before the name
   $desired_function_name()
}
else
{
  $desired_function_name = $desired_function_name . "_default";
  if( function_exists($desired_function_name))
  {
     //Call the default
     //Note the $ before the name
     $desired_function_name()
  }
  else
  {
     // Nor the plugin nor the default were defined
  }
}

So, now, if the require_once(plugin.php) contains a function called "open_table()", it will be used. Instaed, "open_table_default()" will be used.

It's not like overloading functions, but it is very useful to write scripts ampliable by other programmers: If they write a function, it is used, if not, the default is used.

See ya!
Xavier Montero.

<ftp_systypecall_user_func_array>
 Last updated: Tue, 21 Dec 2004
show source | credits | sitemap | contact | advertising | mirror sites 
Copyright © 2001-2005 The PHP Group
All rights reserved.
This unofficial mirror is operated at: /
Last updated: Mon Mar 14 08:13:06 2005 Local time zone must be set--see zic manual page