我有以下情况。
我有一个有很多功能的课程。每个函数都以执行相同的方法开始。有没有办法可以将这个方法实现到函数中,以便自动执行?
以下是一个例子:
class test
{
static function_1($param) {some_method($param); other stuff....}
static function_2($param) {some_method($param); other stuff then function 1....}
static function_3($param) {some_method($param); other stuff then function 1 and function 2....}
}
那么有没有办法自动执行some_method();
而不在每个函数中声明它?
提前致谢!
整个代码:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
* The Assets Library
*
* This class let's you add assets (javascripts, stylesheets and images) way easier..
*/
class Assets {
private $css_url;
private $js_url;
private $img_url;
public function __construct()
{
$CI =& get_instance();
$CI->config->load('assets');
$asset_url = base_url() . $CI->config->item('assets_dir');
$this->css_url = $asset_url . $CI->config->item('css_dir_name');
$this->js_url = $asset_url . $CI->config->item('js_dir_name');
$this->img_url = $asset_url . $CI->config->item('img_dir_name');
}
// Returns the css html link
public function css_html_link($filename)
{
// Check whether or not a filetype was given
$filename = $this->_add_filetype($filename, 'css');
$link = '<link type="text/css" rel="stylesheet" href="' . $this->css_url . $filename . '" />';
return $link;
}
// Returns the css link
public function css_link($filename)
{
$filename = $this->_add_filetype($filename, 'css');
return $this->css_url . $filename;
}
// Returns the js html link
public function js_html_link($filename)
{
$filename = $this->_add_filetype($filename, 'js');
$script = '<script type="text/javascript" src="' . $this->js_url . $filename . '"></script>';
return $script;
}
// Return the js link
public function js_link($filename)
{
$filename = $this->_add_filetype($filename, 'js');
return $this->js_url . $filename;
}
// Returns the image html tag
public function img_html_link($filename, $rel = NULL)
{
// Get the filename without the filetype
$alt_text = substr($filename, 0, strpos($filename, '.')+1);
$alt_text = 'alt="'.$alt_text.'"';
// If relation is giving, use it
$img_rel = ($rel !== FALSE) ? 'rel="' . $rel . '"' : '';
$image = '<img src="' . $this->img_url . $filename . '" '.$rel.' ' . $alt_text . '/>';
return $image;
}
// Return the image link
public function img_link($filename)
{
return $this->img_url . $filename;
}
// Check whether or not a filetype was specified in $file, if not, it will be added
private function _add_filetype($file, $type)
{
if(strpos($file, '.' . $type) === FALSE)
{
$file = $file . '.' . $type;
}
return $file;
}
}
/* End of file assets.php */
/* Location: ./application/libraries/assets.php */
答案 0 :(得分:2)
每次启动该类时,它都会调用__construct()函数,或者在PHP 4中(我希望您不使用php 4)它使用与该类同名的函数
如果你这样做,它应该适用于班级的每个发起人:
function __construct($param){
some_method($param);
}
如果你在同一个类的启动中调用多个函数,你可以这样做:
var $param;
function __construct($param){
$this->param = $param;
}
function doMethod(){
some_method($this->param);
}
function function_1()
{
$this->doMethod();
}
使用不同的参数多次调用该类。也许尝试这种方法:
function __call($function, $param){
some_method($param);
switch ($function){
case 'function1':
$this->function1($param);
break;
/// etc..
}
}
答案 1 :(得分:1)
我担心在这种情况下答案是'不'。
你不是每次都“宣布”some_method()
,而是在呼唤它。如果你不打电话,它就无法运行,所以你每次都要打电话。
Cut&amp;糊.....
为什么不在这里粘贴你的实际代码,一些重构可能有所帮助。
查看实际代码后进行编辑
我看不到您现有代码的问题。很明显,你会知道它在一年的时间里做了什么。我会保持原样。您接受的答案将起作用,但它会使您的代码模糊不清。当你回来维护你的代码时,你将会遇到问题以及你为什么要这样做。
答案 2 :(得分:0)
您可以创建一个包含类test(组合)实例的类,并实现其__call
魔术方法。类似于:
class testWrapper
{
private $test;
function __construct()
{
$this->test = new Test();
}
function __call($name, $args)
{
call_user_func_array(array($this->test, 'some_method'), $args);
call_user_func_array(array($this->test, $name), $args);
}
}
然后,您可以在testWrapper的实例对象上调用test
类中的方法。
您可以进一步优化__call
方法中的逻辑,仅根据传入的方法名称等调用some_method()
。