【问题标题】:creating an array class with php用php创建一个数组类
【发布时间】:2011-01-02 05:06:29
【问题描述】:

如果我有两个数组,即

$text = 'i am passed :)';
$fn = array(
':)',
':-)',
';;)'
)

$rep = array(
'smily1',
'smily2',
'smily3'
            );

$output = str_replace($fn, $rep, $text);

echo $output;

我想为此创建一个类,以便将来在我想要的地方使用... 我怎样才能为它上课...

还有我怎样才能为此创建一个函数...

【问题讨论】:

  • 我在这里并没有真正看到技术问题。为什么不使用已有的方法呢?创建一个包含此功能的类会很简单。
  • 你想让这堂课做什么?您正在寻找创建“类 SmileyReplacer”吗?你所拥有的有什么问题,为什么它应该是一个类?
  • 你也可以看看这个问题:stackoverflow.com/questions/65091/…
  • 嘿。我不记得那是我的问题。不是为了选票,老实说:)

标签: php


【解决方案1】:

基本上是通过将你的函数包装在一个类中。如果您正在寻找更高级的功能,则必须指定。

<?php

class SmileyFilter {
  private $_keys;
  private $_values;

  function add($key, $value) {
     $this->_keys[] = $key;
     $this->_values[] = $value;
  }

  function add_all($pairs) {
    foreach ($pairs as $key => $value)
      $this->add($key, $value);
  }

  function replace($text) {
    return str_replace($this->_keys, $this->_values, $text);
  }
}

// usage

$s = new SmileyFilter();

$s->add(':)', 'smily1');
$s->add(':-)', 'smily2');
$s->add(';;)', 'smily3');

/* OR

$smileys = array(
  ':)'  => 'smily1',
  ':-)' => 'smily2',
  ';;)' => 'smily3');

$s->add_all($smileys);

*/


$s->replace('i am passed :)'); // "i am passed smily1"
?>

【讨论】:

    【解决方案2】:
    class SmileyReplacer
    {
        protected static $_map = array(
            ':)'  => 'smiley1',
            ':-)' => 'smiley2',
            ';;)' => 'smiley3'
        );
    
        public static function replace($string)
        {
            return str_replace(array_keys(self::$_map), self::$_map, $string);
        }
    }
    
    // Usage
    echo SmileyReplacer::replace('I am happy :)'); // I am happy smiley1
    

    我看不出为什么应该实例化它,所以一个全静态的类就可以了。里面没有真实的状态。你可以添加一个静态方法addMap(array $map),你可以传递一个关联数组,以防你想从外部提供地图。

    如果您担心每次运行replace 时对array_keys 的调用,请执行基准测试。我非常怀疑你能否想出足够多的笑脸,所以它真的会对性能产生影响。

    【讨论】:

      【解决方案3】:

      笑脸

      class Smiley {
          private $name;
          private $data;
      
          public function getName() {
          return $this->name;
          }
      
          public function setName($name) {
          $this->name = $name;
          return $this;
          }
      
          public function getData() {
          return $this->data;
          }
      
          public function setData($data) {
          $this->data = $data;
          return $this;
          }
          function __construct($name = null, $data = null) {
          $this->name = $name;
          $this->data = $data;
          }
      
      }
      

      SmileyMapper

      class SmileyMapper {
          private $smilies = array();
      
          public function addSmiley(Smiley $smiley) {
          $this->smilies[] = $smiley;
          return $this;
          }
          public function replaceSmileys($str) {
          return str_replace(
              array_map(
                  create_function(
                  'Smiley $item',
                  'return $item->getData();'
                  ),
                  $this->smilies),
              array_map(
                  create_function(
                  'Smiley $item',
                  'return $item->getName();'
                  ),
                  $this->smilies),
              $str
          );
          }
      }
      

      示例

      $text = 'i am passed :)';
      $fn = array(
          ':)',
          ':-)',
          ';;)'
      );
      
      $rep = array(
          'smily1',
          'smily2',
          'smily3'
      );
      
      $sm = new SmileyMapper();
      foreach ($fn as $k => $v) {
          $sm->addSmiley(new Smiley($rep[$k],$v));
      }
      echo $sm->replaceSmileys($text);
      

      【讨论】:

      • 现在设计严重过度,但很有趣 :)
      • 我认为它适合像笑脸这样的主题。 :P
      • Smiley 应该实现一个接口。只想确认一下。为什么不为 SmileyMaper::smileys 使用 SplObjectStorage :) err smiley1
      • 我还认为有必要实现一个模板引擎来满足不同的视图需求。你不同意吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 2020-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多