2016-03-07 4 views
1

Я пытаюсь написать класс для API, и мне нужен мой конструктор, чтобы использовать некоторые методы в качестве параметров (потому что я получаю данные из csv). Я делаю некоторые испытания с этим:Метод pass как параметр конструктора

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.

Оригинальный дизайн выполнен на различных функциях, взаимодействующих друг с другом. Это было не самое лучшее, потому что данные извлекались снова и снова, вместо того, чтобы читать только с 1 места.

методы для 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; 
} 

Edit: Включая индексный файл, где я тестирование объекта.

<?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

Некоторые вещи неправильно с кодом. Вот несколько примеров, чтобы показать различные подходы:

-example 1

class Foo { 

    public $a; 
    public $b; 

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

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

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

-example 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. В ООП у нас обычно есть геттеры и сеттеры. И они в основном используются, когда мы инкапсулируем наш класс. Это пример ecapsulated класса:

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

Обратите внимание, что $a является частным, поэтому мы не имеем к нему доступ непосредственно из класса.У нас есть, чтобы использовать методы. Таким образом, мы можем контролировать доступ к этому атрибуту, выполнять некоторую проверку и т. Д. (Если хорошо спроектировано). Это дает нам возможность дополнительно изменить реализацию способа получения/установки значений без необходимости поиска их в весь проект. Если в будущем вы решите, что $a может иметь только номера, просто измените сеттер.

Это действительно зависит от того, что $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; 
} 
} 

Reference также методы объекта и избежать использования не объявлены переменные в области видимости функции.

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

Не работает здесь. Возможно, я тестирую это неправильно. Обновление вопроса. – Onilol

+0

Ваши функции setA и setB фактически ничего не делают. Вы должны либо вернуть значения, либо установить свойства объекта в функциях. – purpleninja

+0

У этого есть некоторые неправильные вещи: 1- Поскольку вы устанавливаете значение '$ a' для функции, вы должны что-то вернуть в этой функции. 2- in 'function setA()', '$ a = 'X';' ничего не значит, это должно быть '$ this-> a = 'X';'. Но опять же, это не было бы необходимо с возвращением. Таким образом, вы должны либо изменить '$ this-> a = $ this-> setA();' на просто '$ this-> setA();' и использовать '$ this-> a = 'X';' в function ** или ** change '$ a = 'X';' to 'return 'X;''. – FirstOne

0

Я не понял, почему это нужно, но вы создать вызываемым с таким образом:

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

Теперь вы можете использовать

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

Никакой разницы между ним и использованием $ object-> setA(); –

Смежные вопросы