Array akses dikembalikan oleh fungsi di php

88

Saya menggunakan mesin template yang memasukkan kode ke situs saya di tempat yang saya inginkan.

Saya menulis sebuah fungsi untuk menguji sesuatu yang cukup mudah:

myfunction() { return '($this->data["a"]["b"] ? true : false)'; }

Masalahnya adalah, $ this-> data bersifat pribadi, dan saya tidak dapat mengaksesnya di mana pun, jadi saya harus menggunakan getData (); yang menyebabkan masalah saya.

$this->getData()['a']['b']

tidak berfungsi, dan menetapkan nilai terlebih dahulu juga tidak baik karena akan digunakan secara langsung di blok if ().

Ada ide?

enyo
sumber
Menetapkan nilai pengembalian pasti berhasil dan merupakan satu-satunya cara. Dapatkah Anda menunjukkan kepada kami kode tidak berfungsi Anda?
Anti Veeranna
Yah itu tidak berfungsi karena kode akan disisipkan dalam if (/ * kode di sini * /). Jadi saya tidak bisa begitu saja menetapkan data sebelumnya.
enyo
1
Apa sih yang sedang kamu bangun? :) sesuatu dengan eval?
Anti Veeranna
Apa yang Anda coba periksa? Apakah Anda mencoba melihat apakah elemen array ada dan memiliki nilai yang tidak kosong? Anda dapat menggunakan fungsi 'kosong' untuk ini. Pertanyaan ini membutuhkan lebih banyak kejelasan!
txwikinger
Bagaimana (dulu) nilai string yang Anda kembalikan myfunction()diproses lebih lanjut? Bagian itu hilang dalam pertanyaan Anda.
hakre

Jawaban:

134

Sejak PHP 5.4, dimungkinkan untuk melakukan hal itu:

getSomeArray()[2]

Referensi: https://secure.php.net/manual/en/language.types.array.php#example-62

Di PHP 5.3 atau sebelumnya, Anda harus menggunakan variabel sementara.

enyo
sumber
4
Saya punya PHP 5.4.11-1~precise+1dan fitur ini tidak berfungsi! Mendapat pesan sebagai tanggapanParse error: syntax error, unexpected '['
Eugene
1
+ Eugene apakah Anda membuatnya bekerja? Mungkin orang lain mengalami masalah yang sama.
enyo
2
Butuh waktu hingga php 5.4 untuk mendukung notasi array yang dikembalikan dari fungsi ?! Benar-benar serangga yang jahat.
Basil Musa
Dan kemudian Anda mencoba untuk mendapatkan elemen pertama dari sebuah array yang dihasilkan oleh array_filter dan mulai menangis
Loupax
17

Anda tidak dapat menggunakan sesuatu seperti ini:

$this->getData()['a']['b']

yaitu, sintaks akses array tidak dimungkinkan secara langsung pada pemanggilan fungsi.

Anda harus menggunakan beberapa variabel sementara , seperti ini:

$tmp = $this->getData();
$tmp['a']['b']    // use $tmp, now

Dalam kasus Anda, ini mungkin berarti menggunakan sesuatu seperti ini:

function myfunction() {
  $tmp = $this->getData();
  return ($tmp['a']['b'] ? true : false);
}

Kamu harus :

  • pertama, panggil getData()metode Anda , dan simpan nilai kembaliannya dalam varibale sementara
  • kemudian, gunakan variabel sementara itu untuk pengujian Anda

Anda tidak punya banyak pilihan tentang itu, sebenarnya ...

Pascal MARTIN
sumber
Nah, seperti yang saya katakan, masalah saya adalah kode ini dimasukkan, langsung di if (/ * kode dimasukkan ke sini * /) jadi mendefinisikan fungsi di sana tidak mungkin ...
enyo
Bisakah Anda tidak menetapkan hasil pemanggilan metode ke variabel sebelum pernyataan if, dan menggunakan variabel tersebut dalam pernyataan if, daripada langsung mencoba memanggil metode dari pernyataan if?
Pascal MARTIN
1
Sayangnya tidak ... Ini adalah mesin templating, dan saya tidak punya kendali atasnya.
enyo
12

Oke ... ternyata benar-benar tidak ada cara yang lebih baik, jadi saya akan menjawab sendiri dengan solusi yang tidak begitu indah:

Saya membuat fungsinya:

arrayGet($array, $index) { return $array[$index]; }

Dan menggunakannya seperti ini:

myfunction() { return '(arrayGet(arrayGet($this, "a"), "b") ? true : false)' }

Ini tidak bagus tapi berhasil.

enyo
sumber
1

$this->dataadalah selalu diakses, jika dilindungi. tidak dapat diakses dari mana-mana, jadi jika Anda kembali dalam kode Anda, dan dievaluasi seperti itu, seharusnya baik-baik saja.$object->data$this

Btw, ada bug di kode Anda: Tanda kutip harus di-escape.

myfunction() { return '($this->data[\'a\'][\'b\'] ? true : false)'; }
Soulmerge
sumber
Ya maaf ... Saya mengoreksi posting saya: $ this-> data bersifat pribadi tentu saja. Juga mengoreksi kesalahan ketik saya saat membuat bug.
enyo
1

Ini dimungkinkan dari PHP versi 5.4.

Jika Anda tidak menginginkan variabel sementara untuk itu dan versi PHP Anda kurang dari 5,4 , Anda masih dapat menggunakan beberapa fungsi bawaan untuk mendapatkan elemen pertama atau terakhir:

$x     = 'first?last';
$first = array_shift(explode('?', $x));
$last  = end(explode('?', $x));
$last2 = array_pop(explode('?', $x));

Sunting: !!! Harap dicatat, bahwa dalam versi yang lebih baru (5.4+) PHP akan memberikan pemberitahuan, karena end hanya mengharapkan variabel sebagai parameter.

Lajos Meszaros
sumber