在PHP中重用代码的最佳方法是什么?

时间:2009-08-19 15:23:33

标签: php code-reuse

代码:

if ( $_GET['tab'] == 'newest' ) { 
      // Go through each question
      foreach( array_reverse( $end_array, true ) as $tags_and_Qid['question_id'] => $titles_and_Qid['title'] )
      {   
        // Grab the title for the first array
        $title = $titles [ $tags_and_Qid['question_id'] ] ['title'];

        // Grab the tags for the question from the second array
        $tags = $end_array [ $tags_and_Qid['question_id'] ] ['tag'];

        // Grab the username for the question from the second array
        $username = $usernames [ $tags_and_Qid['question_id'] ] ['username'];
        --- cut ----                                                                                                                                                       
      }   
  }

我经常需要使用此代码。唯一的区别是第一个示例中的array_reverse (..., true)

我试图通过创建一个函数organize_question来解决这个问题。我没有成功:

function organize_questions ( $tab ) {
      if ( $_GET['tab'] == 'newest' ) {
        echo ( "array_reverse ( $end_array ,  true )" ); 
                                  // Problem here!
      }
      if ( $_GET['tab'] == 'oldest' ) {
          echo ( "$end_array" );    
            // this does not work
      } else {
        echo ( "array_reverse ( $end_array ,  true )" );
                                   // Problem here!
      }
  }

然后我将代码中的相关行更改为:

 foreach( organize_question( $tab ) as $tags_and_Qid['question_id'] => $titles_and_Qid['title'] )

问题在于将变量从一个函数转移到另一个函数 我试图将所有必要的变量放在函数的参数中,但是一切都被破坏了,因为这个函数有很多依赖。

我是PHP的新手,所以必须有比我正在尝试的更简单的方法。

5 个答案:

答案 0 :(得分:5)

听起来这部分代码可以完成大部分工作:

  // Go through each question
  foreach( array_reverse( $end_array, true ) as $tags_and_Qid['question_id'] => $titles_and_Qid['title'] )
  {   
          -- cut ---
  }

我会将$_GET['tab']检出你的organize_questions()功能,并在其他地方做出参数决定。像这样:

function organize_questions($array)
{
    foreach($array as $questionId => $title )
      {   
            //do the work
      }   
}

然后将您的决策制定在其他地方:

  if ( $_GET['tab'] == 'newest' )
  {
    organize_questions(array_reverse ( $end_array ,  true ));
  }
  else if ( $_GET['tab'] == 'oldest' )
  {
      organize_questions($end_array);
  } 
   else
  {
     //etc.
  }

答案 1 :(得分:1)

function organize_questions () 
{
    if ( $_GET['tab'] == 'newest' ) 
    {
        print_r( array_reverse( $end_array ,  true ) ); 
    }
    else if ( $_GET['tab'] == 'oldest' ) 
    {
        print_r($end_array);    
    } 
    else 
    {
        print_r(array_reverse ( $end_array ,  true ) );
    }
}

我删除了回声并使用了print_r(假设这些变量实际上是数组)。另外,除非你在函数中的其他地方使用$ tab,否则它是不需要的。

编辑:我实际上不会使用print_r ...它对调试很有用。通常你需要一些方法从你想要显示的数组中挑选碎片,并使用回声或打印单个碎片。

EDIT2:我在这方面得到了投票和投票。它用正确的语法重写了有问题的函数。问题的部分内容非常模糊,所以我会继续。您似乎也要求将信息传递给函数。有问题的$ _GET ['tab']是访问get变量(yoursite.com/index.php?tab=newest)。您似乎要问的是如何使用功能。你有正确的说法:

function organize_questions( $tab )
{
    ...
}

假设您要使用变量选项卡。为了使用这个函数,你可以从文件中的另一个函数或者执行php_require或php_include的另一个文件中调用它:

$mytab = 'bob';
organize_questions( $mytab);

然后你会使用你之前创建的函数中的原始$ tab,或者我在上面用参数列表中的$ tab指出

答案 2 :(得分:1)

这是一个很好的问题。你肯定可以花很长时间尝试不同的方法来避免重用代码。我可能会做一个上面列出的功能建议,但另一个选择是将代码放在一个单独的PHP文件中,然后将其包含在您想要的位置。这基本上相当于其他语言的内联函数,如果你担心执行速度,这是一个很好的方法。但是,在大多数情况下,您会更担心通过http发送客户端的页面大小,因此这不会像编写函数那样可接受。我大多指出每种情况都有一个不同的“最佳”解决方案 - 在你的情况下,我会说McAden的答案很好。

使用include:

//myscript.php
if ( $_GET['tab'] == 'newest' ) 
{
    print_r( array_reverse( $end_array ,  true ) ); 
}
else if ( $_GET['tab'] == 'oldest' ) 
{
    print_r($end_array);    
} 
else 
{
    print_r(array_reverse ( $end_array ,  true ) );
}

然后在你的代码中:

//myexecutionplace.php
$end_array = foo;
include 'myscript.php';
doStuffWith($end_array);
$end_array = foo2;
include 'myscript.php';
doStuffWith($end_array2);

答案 3 :(得分:1)

您正在寻找的是一种策略......

$strategies = array(
  'oldest' => create_function(
      '$questions', 
      'return organize_questions($questions);'
  ),
  'hottest' => create_function(
      '$questions', 
      'return organize_questions(sort_by_hottness($questions));'
  ),
  'default' => create_function(
      '$questions', 
      'return organize_questions(array_reverse($questions, true));'
  ),
);

$strategy = 'default';

if (array_key_exists($strategies, $_GET['tab'])
    $strategy = $_GET['tab'];

print_r( $strategies[$strategy]($questions) );

你基本上是说你有这些东西(问题),你想做什么(排序)。

您可能还想查看usort函数http://www.php.net/manual/en/function.usort.php

答案 4 :(得分:0)

function sortArray($direction, $array)
{
    switch ($direction) { 
        case 'oldest':
            return array_reverse($array, true);
        case 'newest':
            return $array;
        default:
            return array(); 
    }
}

function processQuestions($array)
{
    foreach($array as $tags_and_Qid['question_id'] => $titles_and_Qid['title'] ) {   
        //code
    } 
}

$sortedArray = sortArray($tab, $end_array);
processQuestions($sortedArray);

你应该改写以下内容。

foreach($array as $tags_and_Qid['question_id'] => $titles_and_Qid['title'] )
//could be rewritten as 
foreach($array as $question_id => $title)