php面向对象问题???

码无边 2012-08-02 05:37:32
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,怎么得到
...全文
521 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
码无边 2012-08-11
  • 打赏
  • 举报
回复
<?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] => )
码无边 2012-08-09
  • 打赏
  • 举报
回复
现在又有一个问题,我在控制器提交接收多个值,怎么将这些全部保存在CelanRequest 的set方法里面呢?
码无边 2012-08-09
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

看了你9楼的的描述,感觉你的代码很乱,不过大概得意思是动态添加验证类进行数据验证吧?我刚刚写了个简单的你参考下:
<meta http-equiv="content-type" content="text/html;charset=utf8"/>
<?php
$request = array("arg1" => "1","arg2" => "3");

$val1 = new Vali……
[/Quote]哥们、你是怎么保存过滤干净的值呢?
码无边 2012-08-06
  • 打赏
  • 举报
回复
还有追加一个问题,怎么获取验证完成之后干净的值?如果加上单例模式进行设计该如何做?
码无边 2012-08-06
  • 打赏
  • 举报
回复
有点类似:假如CleanRequest是一个类,它是来存储过滤干净的值(前端控制器干净值) 通过set方法将值保存起来。之后需要的话,直接从这个对象里面 get来获取。
MENGMENG 2012-08-06
  • 打赏
  • 举报
回复
得想到用t函数了才能执行的,,,不然你数组里面都赋值呢,,也可以吧t函数里面的内容放到析构函数里面,然后,按照你的方法就可以得到了
码无边 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 的回复:]

引用 26 楼 的回复:

这就是你的问题了,如果不验证,你是如何做的?那么验证了你还是怎么做。因为验证失败是不会到达后继环节的

传入的数据 --> T --> 正确的数据
|
v
数据验证,出错退出


其实就是这样:$valitor->addvalid((new Filter('user','用户名错误','int',true)));
默认是验证的,如果不强制验证的……
[/Quote]如何去设计?
码无边 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 的回复:]

这就是你的问题了,如果不验证,你是如何做的?那么验证了你还是怎么做。因为验证失败是不会到达后继环节的

传入的数据 --> T --> 正确的数据
|
v
数据验证,出错退出
[/Quote]

其实就是这样:$valitor->addvalid((new Filter('user','用户名错误','int',true)));
默认是验证的,如果不强制验证的话,就是false。
如果那个字段不进行验证(将不验证的字段值+验证干净的值)=存储到一个对象里面。有点类似工厂函数 set ,get 方法。之后在控制器将取到的值传到model里面进行处理(可以传一个对象),在model里面通过引用取到值public static function getinfo(CleanRequest &$clean){
//$user=$clean->get('user');
//model 里面执行的crm操作。
},
大概思路是这样的。
xuzuning 2012-08-06
  • 打赏
  • 举报
回复
这就是你的问题了,如果不验证,你是如何做的?那么验证了你还是怎么做。因为验证失败是不会到达后继环节的

传入的数据 --> T --> 正确的数据
        |
        v
     数据验证,出错退出
码无边 2012-08-05
  • 打赏
  • 举报
回复
public function getErrors(){
//我的想法是调用Validate类的getError()方法,但是实例化Validate类需要传递参数(在这里受到阻碍所以这里不知道怎么去突破)。
}
如果按照单利模式,我的这个getErrors方法还是要获取validate类的getErrors()方法。但是这个参数怎么从Filter类的构造函数中获取???
码无边 2012-08-05
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 的回复:]

你根本就没仔细看我#19的回复!
如果 Validate类是静态类的话,整个代码执行期间只被实例化一次。所以根本就不存在实例化Validate类需要传递参数的问题
[/Quote]老大,不好意思,之前真的没有体会到你说的问题,思路可能想的太受限。
xuzuning 2012-08-05
  • 打赏
  • 举报
回复
你根本就没仔细看我#19的回复!
如果 Validate类是静态类的话,整个代码执行期间只被实例化一次。所以根本就不存在实例化Validate类需要传递参数的问题
码无边 2012-08-05
  • 打赏
  • 举报
回复
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类需要传递参数(在这里受到阻碍所以这里不知道怎么去突破)。
}
}
码无边 2012-08-05
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]

1、修改 Validate 为单例模式
PHP code
class Validate {
private static $_Instance;
private function __construct() {}
private function __clone(){}
public static function getInstance() {
if(empty(s……
[/Quote]现在实例化validator类但是getError()怎么获取$message也就是怎么获取Filter类里面构造函数的变量($message)。
码无边 2012-08-04
  • 打赏
  • 举报
回复
先贴上我的代码:
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");
}
}
大概的页面全都弄上来了。关键就是获取验证的错误。
码无边 2012-08-04
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

class Filter{
private $filed;
private $message;
private $curReg;

function __construct($field,$message,$curReg){
$this->filed=$field;
$this->message=$message;
$this-……
[/Quote]根据楼上这哥们的方法,我需要扩展下,就是在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()方法,不合格的就提示出来。
不知道各位怎么去扩展……
xuzuning 2012-08-04
  • 打赏
  • 举报
回复
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() 做相应的操作

franzhong 2012-08-03
  • 打赏
  • 举报
回复
第一种改__construct
function __construct(){
$this->t();
}
既可实现输出为:Array ( [0] => 3 )
第二种改调用部分为:
$a=new factory();
$a->t();
print_r($a->gett());
也可实现输出为:Array ( [0] => 3 )
yunprince 2012-08-03
  • 打赏
  • 举报
回复
没其他回答了估计,就是你初始化的时候没有赋值,


function __construct(){
$this->tmp = array();
}

hjyang2012 2012-08-03
  • 打赏
  • 举报
回复
其实上面的回答是正确的,你如果想省略中间那步可以这样
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());
加载更多回复(13)

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧