0

更新根据专家的指示,我以这种方式修改了代码:

<?php
//Class Validation
class transaction_validate{
    
private $val_id;
    function __construct($id) {
        $this->val_id = $id;
    }

public function status(){
    //Call our server and decode json value
    $data = $this->get_data($this->val_id);
    $obj = json_decode($data);

    return $obj->status;
}

public function amount(){
    //Call our server and decode json value
    $data = $this->get_data($this->val_id);
    $obj = json_decode($data);

    return $obj->amount;
}


//Create a function for fetching data
private function get_data($sid){
    $url = 'https://domain.com/verify/process.php?trx='.$sid;
    $ch = curl_init();
    $timeout = 5;
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}
}

$validate = new transaction_validate();
$validate->val_id = '5201211120944';
echo $validate->amount();
echo '<br>';
echo $validate->status();

输出是

警告:transaction_validate::__construct() 缺少参数 1,

致命错误:无法访问私有财产 transaction_validate::$val_id

使困惑!

============================上一个问题==================== ===================

我只是在学习 OOP 风格的 PHP 编码。试图编写一个供个人使用的脚本,这似乎是错误的。代码是:

<?php
//Class Validation
class transaction_validate{
    
    var $val_id;
    
    public function status(){
        //Call our server and decore json value
        $data = get_data();
        $obj = json_decode($data);
        
        return $obj->status;
    }
    
    public function amount(){
        //Call our server and decore json value
        $data = get_data();
        $obj = json_decode($data);
        
        return $obj->amount;
    }

    
    //Create a function for featching data
    private function get_data($val_id){
        $url = 'https://domain.com/verify/process.php?trx='.$val_id;
        $ch = curl_init();
        $timeout = 5;
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
        curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }
}

$validate = new transaction_validate('5201211120944');
echo $validate->amount();
echo '<br>';
echo $validate->status();

输出是

致命错误:在第 17 行的 /home/userdo/public_html/class.php 中调用未定义函数 get_data()

我需要认识到我做错了什么。

4

3 回答 3

5

您需要告诉 PHP 该函数在类上下文中:

$this->get_data()

如评论中所述,您应该添加一个构造函数来设置您传入的 id ...

class transaction_validate{

    private $val_id;

    function __construct($id) {
        $this->val_id = $id;
    }

    //...

此外,如果您正在编写 OOP,则验证可能属于表示事务的域实体,而不是验证助手类。

于 2012-11-12T17:31:48.847 回答
1

这是因为get_data()不是在全局范围内而是在transaction_validate类中定义的(顺便说一下,我建议将其更改为TransactionValidate;这是 OOP 命名约定之一)。

要调用函数(在 OOP 中 – 方法),您需要使用变量$this,它基本上指向一个类的当前实例(在本例中是transaction_validate.

所以代码应该是这样的:

$data = $this->get_data();
于 2012-11-12T17:39:11.280 回答
1

要调用在类中定义的函数,必须使用类实例调用,即定义函数的类的对象。

在上面的示例中,get_data 是在类中定义的私有函数,根据 OOP 的数据隐藏原则,私有成员只能在同一个类中访问它们隐藏在类之外意味着私有成员不能在类定义之外调用。

因此它将以下列方式调用

<?php

   //Class Validation
  class transaction_validate{

var $val_id;

public function status(){
    //Call our server and decore json value
    $data =$this->get_data();
    $obj = json_decode($data);

    return $obj->status;
}

public function amount(){
    //Call our server and decore json value
    $data = $this0get_data();
    $obj = json_decode($data);

    return $obj->amount;
}


//Create a function for featching data
private function get_data($val_id){
    $url = 'https://domain.com/verify/process.php?trx='.$val_id;
    $ch = curl_init();
    $timeout = 5;
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}
}

         $validate = new transaction_validate('5201211120944');
         echo $validate->amount();
          echo '<br>';
         echo $validate->status();
于 2012-11-12T17:59:41.527 回答