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,怎么得到
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,怎么得到
$a->t();
print_r($a->gett());或者
function __construct(){
array_push($this->tmp,3);
}
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());
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());
function __construct(){
$this->tmp = array();
}
function __construct(){
$this->t();
}
既可实现输出为:Array ( [0] => 3 )
第二种改调用部分为:
$a=new factory();
$a->t();
print_r($a->gett());
也可实现输出为:Array ( [0] => 3 )
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参数值
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;
}
你写一个函数是对的,检单的事,给说复杂了
例如
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();//这就取得了,就这点意思
<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";
}
}
}
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的类写的真是乱七八糟 看着头疼
类似这哥们写的……
/**
* 验证管理类
*
*/
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类进行处理
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'));我没事了 又改了改
我需要调用Filter的checkall()方法。返回false就提示出错误。就是调用Validate 类的geterror(),这时我的问题就来了。我如果需要去调用Validate的方法,我必须去实例化这个类(并且里面有$error参数)。如果按照上面写的。public function valid(){
$Validate = new Validate($this->message);
return $Validate->getErrors();
}
那不是将所有的错误返回回来。我现在要做是 通过验证Filler 的checkall()方法,不合格的就提示出来。
不知道各位怎么去扩展……
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");
}
}
大概的页面全都弄上来了。关键就是获取验证的错误。
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() 做相应的操作
//我的想法是调用Validate类的getError()方法,但是实例化Validate类需要传递参数(在这里受到阻碍所以这里不知道怎么去突破)。
}
如果按照单利模式,我的这个getErrors方法还是要获取validate类的getErrors()方法。但是这个参数怎么从Filter类的构造函数中获取???
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类需要传递参数(在这里受到阻碍所以这里不知道怎么去突破)。
}
}
如果 Validate类是静态类的话,整个代码执行期间只被实例化一次。所以根本就不存在实例化Validate类需要传递参数的问题
|
v
数据验证,出错退出
其实就是这样:$valitor->addvalid((new Filter('user','用户名错误','int',true)));
默认是验证的,如果不强制验证的话,就是false。
如果那个字段不进行验证(将不验证的字段值+验证干净的值)=存储到一个对象里面。有点类似工厂函数 set ,get 方法。之后在控制器将取到的值传到model里面进行处理(可以传一个对象),在model里面通过引用取到值public static function getinfo(CleanRequest &$clean){
//$user=$clean->get('user');
//model 里面执行的crm操作。
},
大概思路是这样的。
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] => )