Попробуйте это:
var fs = require('fs');
var obj;
fs.readFile('./result.json', 'utf8', function (err, data) {
if (err) throw err;
obj = JSON.parse(data);
console.log('title', obj.data.title);
});
Для этого и предназначены абстрактные классы. Абстрактный класс в основном говорит: Кто бы ни наследул от меня, он должен иметь эту функцию (или эти функции).
abstract class whale
{
function __construct()
{
// some code here
}
function myfunc()
{
$this->test();
}
abstract function test();
}
class fish extends whale
{
function __construct()
{
parent::__construct();
}
function test()
{
echo "So you managed to call me !!";
}
}
$fish = new fish();
$fish->test();
$fish->myfunc();
От кит экземпляр Вы не можете вызвать эту функцию. но от рыба экземпляр можно сделать
function myfunc()
{
static::test();
}
Технически, вы не можете вызывать рыбный экземпляр (дочерний) из китового экземпляра (родительского), но так как вы имеете дело с наследованием, myFunc() все равно будет доступна в вашем рыбном экземпляре, так что вы можете вызывать $yourFishInstance->myFunc()
напрямую.
Если вы обращаетесь к шаблону метода pattern, то просто напишите $this->test()
в качестве тела метода. Вызов myFunc()
из fish instance делегирует вызов на test()
в fish instance. Но опять же, никакой вызов от китового экземпляра к рыбному экземпляру.
На боковой отметке, кит является млекопитающим, а не рыбой ;)
.Единственный способ сделать это - это отражение. Однако, отражение дорогостоящее и должно использоваться только в случае необходимости.
Истинная проблема здесь заключается в том, что родительский класс никогда не должен полагаться на существование метода дочернего класса. Это руководящий принцип OOD, и указывает на серьезный недостаток в вашей конструкции.
Если ваш родительский класс зависит от конкретного дочернего метода, то он не может быть использован любыми другими дочерними классами, которые могут расширить его также и на . Взаимоотношения между родителями и детьми переходят от абстракции к специфике, а не наоборот. Было бы намного, намного лучше поместить требуемую функцию в родительский класс и, при необходимости, переопределить ее в дочерних классах. Что-то вроде этого:
class whale
{
function myfunc()
{
echo "I am a ".get_class($this);
}
}
class fish extends whale
{
function myfunc()
{
echo "I am always a fish.";
}
}
Хорошо, ну, есть так много вещей неправильных в этом вопросе, что я на самом деле не знаю с чего начать.
Во-первых, рыба - это не киты, а киты - не рыба. Киты - млекопитающие.
Во-вторых, если вы хотите вызвать функцию в дочернем классе от родительского класса, которого нет в вашем родительском классе, то ваша абстракция серьезно повреждена, и вы должны переосмыслить ее с нуля.
В-третьих, в PHP вы можете просто сделать:
function myfunc() {
$this->test();
}
В примере с китом
это приведет к ошибке. В экземпляре fish
это должно работать.
Я бы взял абстрактный класс....
.
но в PHP вы не должны использовать их, чтобы заставить его работать. Даже вызов конструктора родительского класса является "нормальным" вызовом метода, и объект в данный момент полностью "работает", т.е. $this "знает" обо всех членах, наследуемых или нет.
class Foo
{
public function __construct() {
echo "Foo::__construct()\n";
$this->init();
}
}
class Bar extends Foo
{
public function __construct() {
echo "Bar::__construct()\n";
parent::__construct();
}
public function init() {
echo "Bar::init()\n";
}
}
$b = new Bar;
печатает
Bar::__construct()
Foo::__construct()
Bar::init()
, т.е. даже если класс Foo ничего не знает о функции init(), то он может вызвать метод, так как поиск основан на том, на что $this является ссылкой.
.
Это техническая сторона. Но вы действительно должны навязывать реализацию этого метода, либо делая его абстрактным (заставляя потомков реализовывать его), либо предоставляя реализацию по умолчанию, которая может быть перезаписана.
что, если кит не будет расширен? в результате чего вызов этой функции? К сожалению, это невозможно сделать.
О, а рыба продлевает кита? Рыба - это рыба, кит - млекопитающее.