#php #oop #function
#php #ооп #функция
Вопрос:
У меня следующая ситуация.
У меня есть класс с большим количеством функций. Каждая функция начинается с выполнения одного и того же метода. Есть ли способ, которым я могу реализовать этот метод в функции, чтобы он выполнялся автоматически?
Вот пример:
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 =amp; 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 */
Комментарии:
1. @Dagon: тогда он будет выполняться только один раз при создании экземпляра объекта. Я думаю, что op хочет выполнять некоторую работу при каждом вызове метода в объекте, который, вероятно, будет выполняться по-разному каждый раз при изменении состояния объекта.
Ответ №1:
каждый раз, когда вы запускаете класс, он вызывает функцию __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. Объект будет инициализирован только один раз, но функции будут использоваться более одного раза с разными значениями для $param, так что, боюсь, это не сработает.
2. Я только что добавил третий вариант, который вы могли бы использовать
Ответ №2:
Я боюсь, что в этом случае ответ «нет».
Вы не «объявляете» some_method()
каждый раз, вы вызываете его. Если вы не вызываете ее, она не может быть запущена, поэтому вам приходится вызывать ее каждый раз.
Вырезать и вставить…..
Почему бы не вставить ваш фактический код здесь, может помочь некоторый рефакторинг.
Редактировать после просмотра фактического кода
Я не вижу проблемы с вашим существующим кодом. Это понятно, и вы узнаете, что это делает через год. Я бы оставил все как есть. Принятый вами ответ будет работать, но он запутывает ваш код. У вас будут проблемы с разработкой того, что вы сделали и почему вы это сделали, когда вы вернетесь, чтобы поддерживать свой код в будущем.
Комментарии:
1. Хорошо, я скопировал фактический код здесь, код, который вы, может быть, посмотрите на него? Метод, который я имею в виду, _add_filetype
Ответ №3:
Вы могли бы создать класс, содержащий экземпляр класса test (composition) и реализовать его __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()
основе переданного имени метода и т. Д.
Комментарии:
1. Не могли бы вы, мэби, привести пример того, как это реализовать? И будет ли этот подход работать в рамках CodeIgniter? Потому что я использую это.