class factory{
private $tmp=array();
function __construct(){}
public function  t(){
array_push($this->tmp,3);
}
public function gett(){
return $this->tmp;
}
}
$a=new factory();
print_r($a->gett());
怎么输出null,我想输出3,怎么得到

解决方案 »

  1.   

    ...fuction t(){}没有执行过 $tmp=array(); 他就是空数组$a=new factory();
    $a->t();
    print_r($a->gett());或者
    function __construct(){
        array_push($this->tmp,3);
    }
      

  2.   

    <?php

    class factory{
     private $tmp=array();
     function __construct(){}
     public function t(){
     array_push($this->tmp,3);
     }
     public function gett(){
     $this->t();
     return $this->tmp;
     }
    }
    $a=new factory();
    print_r($a->gett());
      

  3.   

    其实上面的回答是正确的,你如果想省略中间那步可以这样
    class factory{
    private $tmp=array();
    function __construct($arg){
    array_push($this->tmp,$arg);
    }
    public function gett(){
    return $this->tmp;
    }
    }
    $a=new factory(3);
    print_r($a->gett());
      

  4.   

    没其他回答了估计,就是你初始化的时候没有赋值,
    function __construct(){
        $this->tmp = array();
    }
      

  5.   

    第一种改__construct
    function __construct(){
    $this->t();
    }
    既可实现输出为:Array ( [0] => 3 ) 
    第二种改调用部分为:
    $a=new factory();
    $a->t();
    print_r($a->gett());
    也可实现输出为:Array ( [0] => 3 ) 
      

  6.   

    <?phpclass factory{
     private $tmp=array();
     private $loop;
     function __construct($loop){}
     public function t(){
     array_push($this->tmp,$loop);
     }
     public function gett(){
    $this->t();
     return $this->tmp;
     }
    }
    $a=new factory(123);
    print_r($a->gett());
    现在遇到一个问题就是构造函数里面的变量$loop是从另外一个地方传递过来的(Filter类的第二个参数)。但是传递参数形式是:
    new Filter('pwd' ,'密码错误','int');
    但是这个类是这样写的。class Filter{
      private $filed;
      private $message;
      private $curReg;
      function __construct($field,$message,$curReg){
      $this->field=$field;
      $this->message=$message;
      this->curReg=$curReg; 
    }
    }不知道大家是否理解我的意思?现在怎么在Filter取到$message参数值
      

  7.   

    我是在Filter类里面写一个方法;class Filter{
      private $filed;
      private $message;
      private $curReg;
      function __construct($field,$message,$curReg){
      $this->field=$field;
      $this->message=$message;
      this->curReg=$curReg; 
    }
    public function valid($raw){
    //首先忽略我原来写的意图,这里只是给个例子
        new Validate($this->message);
    }
    }
     Validate类
    <?php
    class Validate{
      private $error;
      private $errors=array();
      function __construct($error){
         array_push($this->errors,$error);
      }
       public function getErrors(){
         return  $this->errors;
      }
    }?>Validator类:
    class Validator{
     private validators=array();
     public function addvalidators($validator){
          $this->validators[]=$validator;
       }
    public function check($raw){
    foreach($this->validators as $r){
             $r->valid($raw);
         }
      return count($this->geterrors());
    }
    public function geterrors(){
       //这里不知道怎么写
       其实这里就是获取Validate类的getErrors()方法,但是调用Validate类的geterrors方法必须得到$loop参数。
    }}
    我在控制页面的过滤器是这样写的:
    $raw=new request();//这里是一个工厂函数获取提交的数据 request这个类在此忽略不写
    $valitor=new Validator();
    $valitor->check(new Filter('pwd' ,'密码错误','int'));
    $valitor->check(new Filter('pwd' ,'密码错误','int'));
    if(!$valitor->check($raw)){
     return false;

      

  8.   

    补充下 刚才说的$loop 参数其实就是$error ,我刚才写错了。
      

  9.   

    你意思用另一个类里参数来在这个类里用是不
    你写一个函数是对的,检单的事,给说复杂了
    例如  
    public function getMSG(){
         return  $this->$message;//只要把这个值返回就行了
      }
    $obj = new Filter('pwd' ,'密码错误','int');//假设写在这个Filter里面
    $val = $obj->getMSG();//这值就得到了,然后把他给另一个类
    有两种方式,直接构造,或是赋给实例
    把function __construct($val){
    $this->$msgTest = $val;//这样在构造时值就初始化完成了
    }
    另一种写法,跟getMSG()正好相反,其实是一样的
    public function setMSG($val){
         $this->$message = $val;//只要把这个值返回就行了
      }
    这又设进去了,你调用时
    $objTest->setMSG("Hello");
    echo $objTest->getMSG();//这就取得了,就这点意思
      

  10.   

    看了你9楼的的描述,感觉你的代码很乱,不过大概得意思是动态添加验证类进行数据验证吧?我刚刚写了个简单的你参考下:
    <meta http-equiv="content-type" content="text/html;charset=utf8"/>
    <?php
    $request = array("arg1" => "1","arg2" => "3");$val1 = new Validate1($request);
    $val2 = new Validate2($request);
    $validator = new Validator();
    $validator->registerValidors($val1);//注册验证类1
    $validator->registerValidors($val2);//注册验证类2
    $errorCount = $validator->check();
    echo "错误个数为:".$errorCount."<br/>";
    echo "错误信息:<br/>";
    echo "<pre>";
    print_r($validator->geterrors());/**
     * 验证管理类 
     * 
     */
    class Validator{
        private $validators = array();
        private $errors = array();
        public function registerValidors($validator){
            $this->validators[] = $validator;
        }
        
        public function check(){
            foreach($this->validators as $r){
                $r->valid();
                $this->errors = array_merge($this->errors,$r->getErrors());
            }
            return count($this->geterrors());
        }
        
        public function geterrors(){
            return $this->errors;
        }
    }/**
     * 具体验证类得父类
     * 
     */
    class validate{
        protected $errors = array();
        protected $arr;
        public function __construct($arr){
            $this->arr = $arr;
        }
        
        public function valid(){
            
        }
        
        public function getErrors(){
            return $this->errors;
        }
    }/**
     * 验证类1
     * 
     */
    class Validate1 extends validate{
        public function valid(){
            if($this->arr['arg1'] != 1){
                $this->errors[] = "arg1必须等于1";
            }
        }
    }/**
     * 验证类2
     * 
     */
    class Validate2 extends validate{
        public function valid(){
            if($this->arr['arg2'] != 2){
                $this->errors[] = "arg2必须等于2";
            }
        }
    }
      

  11.   

    private $filed;
    private $message;
    private $curReg;
    你的这3个属性都是私有的。class Filter{
      public $filed;
      private $message;
      protected $curReg;  function __construct($field,$message,$curReg){
          $this->filed=$field;
          $this->message=$message;
          $this->curReg=$curReg; 
      }  public function valid($raw){
           // new Validate($this->message);
      }
    }class factory{
     private $tmp=array();
     private $loop; function __construct($err){
         print_r($err->filed);
    // print_r($err->message);
    // print_r($err->curReg);
     }
     
     public function t(){
         array_push($this->tmp,$loop);
     } public function gett(){
        $this->t();
        return $this->tmp;
     }
    }$a=new factory(new Filter('pwd' ,'密码错误','int'));Fatal error: Cannot access private property Filter::$message我也不知道我想的对不对 权当个借鉴吧 LZ的类写的真是乱七八糟 看着头疼
      

  12.   


    类似这哥们写的……
    /**
     * 验证管理类  
     *  
     */
    class Validator{
      private $validators = array();
      private $errors = array();
      public function registerValidors($validator){
      $this->validators[] = $validator;
      }
        
      public function check(){
      foreach($this->validators as $r){
      $r->valid();
      $this->errors = array_merge($this->errors,$r->getErrors());
      }
      return count($this->geterrors());
      }
        
      public function geterrors(){
      return $this->errors;
      }
    }/**
     * 具体验证类得父类
     *  
     */
    class validate{
      protected $errors = array();
      protected $arr;
      public function __construct($arr){
      $this->arr = $arr;
      }
        
      public function valid(){
        
      }
        
      public function getErrors(){
      return $this->errors;
      }
    }
    但是我是在这哥们的的方法上:$validator->registerValidors($val1);//注册验证类1
    但是我是这样写的:$validator->registerValidors(new Filter('验证的字段','验证提示错误','验证规则'));
    只是多加了一个Filter类进行处理
      

  13.   

    class Filter{
      private $filed;
      private $message;
      private $curReg;  function __construct($field,$message,$curReg){
          $this->filed=$field;
          $this->message=$message;
          $this->curReg=$curReg; 
      }  public function valid(){
          $Validate = new Validate($this->message);
      return $Validate->getErrors();
      }
    }class Validate{
      private $error;
      private $errors=array();  function __construct($error){
         array_push($this->errors,$error);
      }   public function getErrors(){
         return  $this->errors;
      }
    }
    class factory{
     private $tmp=array(); function __construct(&$err){
         $this->message = $err->valid();
     print_r($this->message);
     }
    }
    $a=new factory(new Filter('pwd' ,'密码错误','int'));我没事了 又改了改 
      

  14.   

    根据楼上这哥们的方法,我需要扩展下,就是在Filter类里面加上checkall验证的方法,简单一点的话,就用preg_math()来进行匹配。如果失败就返回false,这样加将错误追加到Validate类的geterros()里面。此时我要做的是,$a=new factory(new Filter('pwd' ,'密码错误','int'));
    我需要调用Filter的checkall()方法。返回false就提示出错误。就是调用Validate 类的geterror(),这时我的问题就来了。我如果需要去调用Validate的方法,我必须去实例化这个类(并且里面有$error参数)。如果按照上面写的。public function valid(){
      $Validate = new Validate($this->message);
    return $Validate->getErrors();
      }
    那不是将所有的错误返回回来。我现在要做是 通过验证Filler 的checkall()方法,不合格的就提示出来。
    不知道各位怎么去扩展……
      

  15.   

    先贴上我的代码:
    Validate类:主要是追加错误处理class Validate{
      private $error;
      private $errors=array();
      function __construct($error){
         array_push($this->errors,$error);
      }
       public function getErrors(){
         return  $this->errors;
      }
    }Filter类:处理验证(此方法还未完善)class Filter{
    private $field;
    private $message;
    private $curReg=0;
    private $isreg=true;
    private $filter_reg=array
        (
                'callback'=>FILTER_CALLBACK,
    'float'   =>FILTER_VALIDATE_FLOAT ,//浮点
    'url'     =>FILTER_VALIDATE_URL,//url
    'email'   =>FILTER_VALIDATE_EMAIL,//邮箱
    'int'     =>FILTER_VALIDATE_INT,//数字
    'bool'    =>FILTER_VALIDATE_BOOLEAN,
       );
      
     function __construct($field,$message,$curReg=0,$isReg=true){
        $this->field=$field;
    $this->message=$message;
    $this->filters($curReg);
    $this->isReg=$isReg;
     }
     
       public function filters($curReg){
          if(array_key_exists($curReg,$this->filter_reg))
           $this->curReg=$curReg;
       else
      die("验证格式参数错误!");
       }
       public function validateCoor(Request $raw){
           $valid=$raw->get($this->field);
       $validate=new Validate($this->message);
       if(!empty($valid)){
       if(!filter_var($valid,$this->filter_reg[$this->curReg])){//验证不合格就将错误追加
           new Validate($this->message);
       return false;
       }
       return true;
       }
       }
    }class Validator{
      private $validators=array();
      function __construct(){
        //$this->validators[]=$validator;
      }
       public function addvalid(&$validator){
          $this->validators[]=$validator;
       }
        public function RawValidate($raw){
      foreach($this->validators as $validator){
     $validator->validateCoor($raw);
     }
     return $this->isvalid();
    }
    public function isvalid(){
    return count($this->getErrors())>0;
    }
    public function getErrors(){
             //我的想法是调用Validate类的getError()方法,但是实例化Validate类需要传递参数(在这里受到阻碍所以这里不知道怎么去突破)。
    }
    }-- 页面控制器<?php
    class LoginController extends Controller{
    function IndexAction(){
    $raw=new Request();//工厂函数获取提交数据
    $valitor=new Validator();//验证函数
    $valitor->addvalid((new Filter('user','用户名错误','int')));
    $valitor->addvalid((new Filter('mima','密码错误','int')));
    if(!$valitor->RawValidate($raw)){
      new ErrorPage($valitor->getErrors());//ErrorPage控制器(其实这里就是获取一个数组($valitor->getErrors())返回给这个类(这个类的处理就是smarty来显示这个抛出的错误数组)此处省略)。
    }
    die("ok");
    }
    }
    大概的页面全都弄上来了。关键就是获取验证的错误。
      

  16.   

    1、修改 Validate 为单例模式
    class Validate {
      private static $_Instance;
      private function __construct() {}
      private function __clone(){}
      public static function getInstance() {
        if(empty(self::$_Instance)) self::$_Instance = new self();
        return self::$_Instance;
      }  private $error;
      private $errors=array();  function setError($error){
         array_push($this->errors,$error);
      }
       public function getErrors(){
         return  $this->errors;
      }
    }2、为使用方便,定义一个工作函数
    [codePHP]
    function Validate() {
      return Validate::getInstance();
    }
    [/code]
    3、于是 new Validate($this->message);
    应该写作 Validate()->setError($this->message);
    同样获取已保存的信息,写作 $err = Validate()->getError();4、当然你可以不去定义 Validate 函数
    而是用
    $o = Validate::getInstance();//取得 Validate 的实例
    用 $o->setError($msg) 、$o->getError() 做相应的操作
      

  17.   

     public function getErrors(){
             //我的想法是调用Validate类的getError()方法,但是实例化Validate类需要传递参数(在这里受到阻碍所以这里不知道怎么去突破)。
        }
    如果按照单利模式,我的这个getErrors方法还是要获取validate类的getErrors()方法。但是这个参数怎么从Filter类的构造函数中获取???
      

  18.   

    现在实例化validator类但是getError()怎么获取$message也就是怎么获取Filter类里面构造函数的变量($message)。
      

  19.   

    class Validator{
      private $validators=array();
      function __construct(){
           //$this->validators[]=$validator;
      }
       public function addvalid(&$validator){
          $this->validators[]=$validator;
       }
        public function RawValidate($raw){
          foreach($this->validators as $validator){
             $validator->validateCoor($raw);
             }
             return $this->isvalid();
        }
        public function isvalid(){
            return count($this->getErrors())>0;
        }
        public function getErrors(){
             //如果按照上面老大说的方法也就是
             3、于是 new Validate($this->message);
    应该写作 Validate()->setError([color=#FF99CC]$this->message
    );
    同样获取已保存的信息,写作 $err = Validate()->getError();
    [/color]
         //但是$message怎么获取
             //我的想法是调用Validate类的getError()方法,但是实例化Validate类需要传递参数(在这里受到阻碍所以这里不知道怎么去突破)。
        }
    }
      

  20.   

    你根本就没仔细看我#19的回复!
    如果 Validate类是静态类的话,整个代码执行期间只被实例化一次。所以根本就不存在实例化Validate类需要传递参数的问题
      

  21.   

    这就是你的问题了,如果不验证,你是如何做的?那么验证了你还是怎么做。因为验证失败是不会到达后继环节的传入的数据 --> T --> 正确的数据
            |
            v
         数据验证,出错退出
      

  22.   


    其实就是这样:$valitor->addvalid((new Filter('user','用户名错误','int',true)));
    默认是验证的,如果不强制验证的话,就是false。
    如果那个字段不进行验证(将不验证的字段值+验证干净的值)=存储到一个对象里面。有点类似工厂函数 set ,get 方法。之后在控制器将取到的值传到model里面进行处理(可以传一个对象),在model里面通过引用取到值public static function getinfo(CleanRequest &$clean){
    //$user=$clean->get('user');
    //model 里面执行的crm操作。
    },
    大概思路是这样的。
      

  23.   

    有点类似:假如CleanRequest是一个类,它是来存储过滤干净的值(前端控制器干净值) 通过set方法将值保存起来。之后需要的话,直接从这个对象里面 get来获取。
      

  24.   

    现在又有一个问题,我在控制器提交接收多个值,怎么将这些全部保存在CelanRequest 的set方法里面呢?
      

  25.   

    <?php
    class Validate{
      private $error;
      private static $_instance;
      private $errors=array();
      private $clean;
      function __construct(){
      }
       public static function getInstance(){
            if (!(self::$_instance instanceof  self)) {
                self::$_instance = new self();
            }
            return self::$_instance;
        }
      public function setErrors($error){
          array_push($this->errors,$error);
      }
       public function getErrors(){
         return  $this->errors;
      }
      public static function get($key){
        $raw=new Request();
    return $raw->getParameter($key);
      }
      public static function setclean($key){
    $clean=new CleanRequest();
    $obj=Validate::getInstance();
            $clean=$clean->set($key,$obj->get($key));
    print_r($clean);//此处打印有值
      }
      public static function getCleanRequest(){
        return $this->clean;
      }
    }
    为什么我去调用ClenRequest的getCleanRequest()方法 获取不到值呢?
    而我打印的时候:setclean()方法输出
    CleanRequest Object ( [data:private] => Array ( [user] => 3333 ) ) CleanRequest Object ( [data:private] => Array ( [pwd] => 111111 ) )
    这是我在另外一个类里面写的:public static function getCleanRequest(){
    $valid=Validate::getInstance();
            print_r($valid->getCleanRequest());//此处打印为空值
    return $valid->getCleanRequest();
    }
    打印为:Validate Object ( [error:private] => [errors:private] => Array ( ) [clean:private] => )