2016-03-07 186 views
1

我正在尝试编写一个API的类,我需要我的构造函数使用一些方法作为参数(因为我会从csv获取数据)..我正在做一些用这个测试:作为构造函数参数的传递方法

class API { 

    public $a; 
    public $b; 

    function __construct(){ 
     $this->a = setA($a); 
     $this->b = setB($b); 
    } 

    function setA($a){ 
     $a = "X"; 
    } 

    function setB($b){ 
     $b = "Y"; 
    } 
} 

但它不工作。这甚至可能或正确?

编辑:根据用户Halcyon的要求。

最初的设计是在各种相互作用的功能上进行的。这不是最好的,因为数据一遍又一遍地被读取,而不是从一个地方读取。

为CSV和JSON的方法是:

function getJsonData(){ 
    $stream = fopen('php://input', 'rb'); 
    $json = stream_get_contents($stream); 
    fclose($stream); 
    $order_json_data = json_decode($json, true); 
    return $order_json_data; 
} 

function getProductsTable($csvFile = '', $delimiter = ','){ 
    if (!file_exists($csvFile) || !is_readable($csvFile)) 
     echo 'File not here'; 

    $header = NULL; 
    $data = array(); 

    if (($handle = fopen($csvFile, 'r')) !== FALSE){ 
     while (($row = fgetcsv($handle, 100, $delimiter)) !== FALSE){ 
      if (!$header) 
       $header = $row; 

      else if($row[0] != ''){ 
       $row = array_merge(array_slice($row,0,2), array_filter(array_slice($row, 2))); 
       $sku = $row[0]; 
       $data[$sku]['productCode'] = $row[1]; 
       $data[$sku]['Description'] = $row[2]; 
      } 
     } 

     fclose($handle); 
    } 

    array_change_key_case($data, CASE_LOWER); 
    return $data; 
} 

编辑:包括在那里我测试的对象的索引文件。

<?php 
require_once 'helpers/API.php'; 

if (in_array($_GET['action'],array('insertOrder','updateOrder'))){ 
    $api = new API(); 

    file_put_contents('debug/debug_info.txt', "Object response: {$api->a}, {$api->b}", FILE_APPEND | LOCK_EX); 
} 
+0

'$ a'和'$ b'不存在于构造函数的作用域中;所以相应地定义构造函数定义并在实例化新的API时将它们作为参数传递() –

+0

@MarkBaker当我实例化时,我无法传递它们..这就是问题所在。我正在考虑使用这些方法来获取数据。这是一个坏方法吗? – Onilol

+0

@Onilol数据从哪里来? – Halcyon

回答

1

有些东西是代码错误。下面是几个例子来说明不同的方法:

- 实例1

class Foo { 

    public $a; 
    public $b; 

    function __construct(){ 
     $this->setA(); 
     $this->setB(); 
    } 

    function setA(){ 
     $this->a = "X"; 
    } 

    function setB(){ 
     $this->b = "Y"; 
    } 
} 

- 实例2

class Foo { 

    public $a; 
    public $b; 

    function __construct(){ 
     $this->a = $this->setA(); 
     $this->b = $this->setB(); 
    } 

    function setA(){ 
     return "X"; 
    } 

    function setB(){ 
     return "Y"; 
    } 
} 

请注意,你的代码更喜欢第二例如,但它没有工作,因为该函数没有返回任何东西(并且它丢失了$this)。


我不知道什么$a$b,或者如果你想从类中设置的值(如果它们是恒定的或类似的东西),但我想请注意第二个例子的一个重要方面 - 尤其是如果您真的在设计一个API。在OOP中,我们通常有getter和setter。当我们封装课程时,它们基本上都会使用。这是一个ecapsulated类的例子:

class Bar{ 
    private $a; 
    public function getA(){ return $this->a; } 
    public function setA($a){ $this->a = $a; } 
} 

注意$a是私有的,所以我们没有访问它直接从类的。我们使用的方法。这样我们就可以控制对该属性的访问权限,做一些验证等等(如果设计得很好的话),这给了我们机会来进一步改变值的获取/设置方式的实现,而无需查找它们出现在整个项目。如果将来你决定$a只能有数字,只需更改setter即可。

这真的取决于什么$a是。你也可以有一个__construct来初始化这个变量。有许多不同的方法来做同样的事情。无论如何,看看Why use getters and setters?

+0

欢迎任何意见或建议... – FirstOne

0

。在你的代码中的错误:

class API { 

public $a; 
public $b; 

function __construct($a=null, $b=null){ 
    $this->a = $a; 
    $this->b = $b; 
} 

function setA($a){ 
    $this->a = $a; 
} 

function setB($b){ 
    $this->b = $b; 
} 
} 

也参考对象的方法和避免使用非宣布在函数范围内的变量。

$api = new Api("test", "another value"); 
+0

这里没有工作..也许我测试它错了。更新问题。 – Onilol

+0

你的setA和setB函数实际上并没有做任何事情。您应该返回值或在函数中设置对象属性。 – purpleninja

+0

这有些东西是错误的:1-因为你将'$ a'的值设置为一个函数,所以你必须返回该函数中的某些东西。在函数setA()','$ a ='X';'中表示无意义,应该是'$ this-> a ='X';'。但是,再次,这不是必要的。所以,你应该把'$ this-> a = $ this-> setA();'改成'$ this-> setA();'并使用'$ this-> a ='X';'在函数**或**更改'$ a ='X';'返回'X';'。 – FirstOne

0

我不明白为什么需要它,但你创建与调用这种方式:

function __construct(){ 
    $this->a = [$this, 'setA']; 
    $this->b = [$this, 'setB']; 
} 

现在,你可以使用

$propertyWithCallable = $object->a; 
$propertyWithCallable(); 
+0

它与使用$ object-> setA();之间没有区别。 –

相关问题