PHP Action каждая функция преформ - PullRequest
0 голосов
/ 28 сентября 2011

У меня следующая ситуация.

У меня есть класс с большим количеством функций.Каждая функция начинается с выполнения одного и того же метода.Можно ли как-то внедрить этот метод в функцию, чтобы он выполнялся автоматически?

Вот пример:

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 */

Ответы [ 3 ]

2 голосов
/ 28 сентября 2011

каждый раз, когда вы инициируете класс, он вызывает функцию __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 голос
/ 28 сентября 2011

Боюсь, что в этом случае ответ будет «нет».

Вы не «объявляете» some_method() каждый раз, когда звоните.Если вы не вызываете его, он не может быть запущен, поэтому вы должны вызывать его каждый раз.

Вырезать и вставить .....

Почему бы не вставить свой реальный код сюдаможет помочь некоторый рефакторинг.

Редактировать после просмотра фактического кода

Я не вижу проблемы с вашим существующим кодом.Это ясно, и вы будете знать, что он делает через год.Я бы оставил все как есть.Ответ, который вы приняли, будет работать, но он запутывает ваш код.У вас будут проблемы с разработкой того, что вы сделали, и почему вы это сделали, когда вернетесь для поддержки своего кода в будущем.

0 голосов
/ 28 сентября 2011

Вы можете создать класс, содержащий экземпляр класса 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);
    }
}

Затем вы вызываете методы из класса test объекта экземпляра testWrapper.Вы можете дополнительно уточнить логику в методе __call, чтобы вызывать только some_method() на основе переданного имени метода и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...