Przekazywanie zwracanych wartości przez funkcję

0

Hej, podpowie, ktoś dlaczego mi to nie działa? Jeśli w funkcji getOutput wyświetle wynik: print_r($output); to się wszystko ładnie wyświetla więc komunikacja z API jest ok. Natomiast ja te dane potrzebuje przekazać do zmiennej output w funkcji isLabel.
Wydaje mi się, że mój problem jest związany z przekazaniem danych do funkcji isLabel (?).Ale od rana nie umiem znaleźć błędu.

Dostaję błąd, że w funkcji isLabel w linijce: $output = $this->getOutput("gota.jpg")->get(); że jest za mało argumentów.

Gorąca prośba o pomoc.



class klasa implements def
{
    private $klient;

    private function getOutput(string $Path)
    {

    return $this->klient->detectLabels([
            'Image' => [
                    'Bucket' => 'bucket',
                    'Bytes' => file_get_contents($Path),
        ],
            'MaxLabels' => 5,
            'MinConfidence' => 50,
        ]); 
    }

    public function isLabel(string $word): bool
    {
        $output = $this->getOutput("fota.jpg")->get();
        print_r($output); 
    }
}

0

masz błąd dokładnie w miejscu gdzie postanowiłeś ukryć ten kod także brawo ty.

1

Podepnij xdebuga i debuguj. Nie widząc co się dzieje w tej bibliotece/klasie nic ci nie pomoże.

0
mr_jaro napisał(a):

Podepnij xdebuga i debuguj. Nie widząc co się dzieje w tej bibliotece/klasie nic ci nie pomoże.

Dokładnie taki błąd się pojawia
screenshot-20200524212448.png

0
  1. to nie jest xdebug
  2. w tym co pokazałeś dokładnie jest podane co masz źle.
0
mr_jaro napisał(a):
  1. to nie jest xdebug
  2. w tym co pokazałeś dokładnie jest podane co masz źle.

2/ No właśnie nie wiem.. Nie mam zbyt dużego doświadczenia jeszcze. :(

0

Przeczytaj komunikat, albo wpisz w translator (pomijając ścieżki), tam na prawdę jest napisane dokładnie co zrobiłeś źle a nie jakaś czarna magia.

0

Już to robiłem, gdyby to było proste dla mnie to nie prosiłbym tutaj o pomoc.

2

omg... czego nie rozumiesz w zdaniu "przekazano 0 argumentów do funkcji get a oczekiwano 1" ?

0
mr_jaro napisał(a):

omg... czego nie rozumiesz w zdaniu "przekazano 0 argumentów do funkcji get a oczekiwano 1" ?

A co powinno być tym parametrem?

0

a skąd ja mam wiedzieć? Musisz spojrzeć w dokumentację tego co sam używasz

0

Otwórz soie klasę AWS/Result i zobacz jaki argument przyjmuje metoda get(), ja widzę, że coś przyjmuje...

0

Znalazłem w internecie: https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.Result.html#_get, że parametrem jest jakiś klucz do odzyskania, który jest typu string, ale nie wiele mi to mówi. Aplikacja korzysta z API nie mam dostępu do w projekcie do tej klasy. Korzystam composera. Porśba o pomoc.

0

Chodzi o klucz/index taki jak na przykład w tablicy asocjacyjnej. Nie chcę mi się czytać na telefonie ale zapewne ResultInterface to obiekt z wieloma kluczami i musisz podać ten który chcesz odczytać. Użyj debuggera jak radził kolega albo chociaż var_dump i sprawdz co zawiera obiekt na którym próbujesz odpalić get()

0
hadwao napisał(a):

Chodzi o klucz/index taki jak na przykład w tablicy asocjacyjnej. Nie chcę mi się czytać na telefonie ale zapewne ResultInterface to obiekt z wieloma kluczami i musisz podać ten który chcesz odczytać. Użyj debuggera jak radził kolega albo chociaż var_dump i sprawdz co zawiera obiekt na którym próbujesz odpalić get()

Rozumiem, ze w tym miejscu? Bo po przypisaniu to się nie wykona.

 public function isLabel(string $word): bool
    {
        var_dump($output); 
        $output = $this->getOutput("fota.jpg")->get();
    }

to wyrzuca tylko taką linijke.

C:\wamp64\www\pai\services\aws.php:51:null

@Edit
Nie no, ten var_dum w tym miejscu jest bez sesnu..
Chyba chodziło Ci, zebym dał go w na końcu funkcji getOutput. Wtedy zwróci mi wynik z API.

@edit2
var_dump na końcu funkcji getOutput, wyrzuca coś takiego. Ale już print_r wyrzuca wynik z API

C:\wamp64\www\pai\services\aws.php:33:
object(Aws\Result)[126]
  private 'data' => 
    array (size=3)
      'Labels' => 
        array (size=2)
          0 => 
            array (size=4)
              ...
          1 => 
            array (size=4)
              ...
      'LabelModelVersion' => string '2.0' (length=3)
      '@metadata' => 
        array (size=4)
          'statusCode' => int 200
          'effectiveUri' => string 'https://rekognition.us-east-1.amazonaws.com' (length=43)
          'headers' => 
            array (size=5)
              ...
          'transferStats' => 
            array (size=1)
              ...
  private 'monitoringEvents' => 
    array (size=0)
      empty
0

No to chyba jak widać Result, który zdumpowaleś zawiera kilka kluczy - musisz któryś z nich wybrać i wpisać w get.
Uprzedzając kolejne pytanie - zadeklarowałeś, że funkcja zwraca bool, a Twoja nic nie zwraca więc zrób tam casta do bool i return tego.
Warto też zadbać o obsługę błędów, bo zapewne jak np. plik nie istniej to AWS zwróci Exception.

0
hadwao napisał(a):

No to chyba jak widać Result, który zdumpowaleś zawiera kilka kluczy - musisz któryś z nich wybrać i wpisać w get.
Uprzedzając kolejne pytanie - zadeklarowałeś, że funkcja zwraca bool, a Twoja nic nie zwraca więc zrób tam casta do bool i return tego.
Warto też zadbać o obsługę błędów, bo zapewne jak np. plik nie istniej to AWS zwróci Exception.

Wyrzuca mi jeszcze dwa błędy. Mam coś takiego:

public function isLabel(string $word): bool
    {
        $output = $this->getOutput("fota.jpg")->get("Labels");
        echo gettype($output); //zwraca array

        foreach ($output->data() as $c) {
            if ($c->name() == $word) {  //w tej lini wywala poniższy błąd
                return true;
            }
        }
        return false;
    } 
}

Dostaje taki błąd:
screenshot-20200526194629.png

1

Twoim problemem jest to, że pchasz się w używanie jakiegoś API ale kompletnie nie rozumiesz co robisz jeśli chodzi o konstrukty językowe.

Teraz próbujesz wywołać metodę "name" na obiekcie $c (czyli $c->name()) ale w tym momencie $c to jest tablica, a metody wywołuje się na obiektach.

0

dlatego, że w get jako parametr mam "Labels" to dlatego $output jest tablicą a nie obiektem?

0

Gdyby tylko istniał sposób aby w edytorze otworzyć tą klasę i zobaczyć co zwraca ta metoda to życie programistów byłoby takie proste. Zamiast bawić się w grupowe zgadywanie na forum po prostu sprawdzaliby w kodzie źródłowym albo używali debuggera.

0

Sprawdziłem co zwraca funkcja getOutput() - zwraca mi obiekt. Dopiero jak w funkcji isLabel gdy chcę zwróconą wartość przypisać do $output to output robi się tablicą a nie obiektem.

0

Królu złoty... ostatni raz bo nie mam siły... robisz tak:

$output = $this->getOutput("fota.jpg")->get("Labels");
echo gettype($output); //zwraca array

Sam piszesz że ci zwraca array więc potem w pętli lecisz po tej tablicy a skoro lecisz po tablicy to nie wywołujesz jakiegoś $c->name() bo to nie jest obiekt tylko tablica... więc powinno być $c['cośtam'] === $word

Jeśli dalej nie rozumiesz to czytaj ten kod aż zrozumiesz... i wróć do podstaw zanim zaczniesz używać API

Swoją drogą ciekawy jestem jakim cudem działa $output->data() skoro $output to tablica... coś tam masz nieźle namieszane...

1 użytkowników online, w tym zalogowanych: 0, gości: 1