Как правильно расширить класс в другом файле? - PullRequest
8 голосов
/ 11 ноября 2011

Вот что у меня есть в foo.php

class Foo
{
    public $foo = NULL;
    public $foo2 = NULL;

    public function setFoo ($foo, $foo2)
    {
       $this->foo = $foo;
       $this->foo2 = $foo2'
    }
}

Это то, что у меня есть в foo3.php

class Foo3 extends Foo
{
    public $foo3 = NULL;

    public function setFoo3 ($foo3)
    {
       $this->foo = $foo3;
    }
}  

Вот как мне это нужно в моем третьем файле run.php:

require_once "foo.php";
require_once "foo3.php";
$foo = new Foo();
$foo->setFoo3("hello");

Я получаю эту ошибку:

Неустранимая ошибка: вызов неопределенного метода Foo :: setFoo3 ()

Я не уверен, что проблема в том, как я их требую. Спасибо.

Ответы [ 3 ]

10 голосов
/ 11 ноября 2011

В вашем примере вы создаете экземпляр Foo, который является родителем и не знает метода setFoo3(). Попробуйте это:

class Foo3 extends Foo
{
    ...
}

require_once "foo.php";
require_once "foo3.php";
$foo = new Foo3();
$foo->setFoo3("hello");
9 голосов
/ 11 ноября 2011

Во-первых, в вашем foo.php не следует отмечать ваши поля public, потому что вы устанавливаете эти значения в методе setFoo($foo1, $foo2).Вместо этого у вас может быть что-то вроде:

<?php

class Foo
{
    private $foo1;
    private $foo2;

    public function setFoo($foo1, $foo2) {
        $this->foo1 = $foo1;
        $this->foo2 = $foo2;
    }
 }

Затем вы должны добавить ключевое слово extends при объявлении класса Foo3 и еще одну вещь, которую вам нужно включить в начало файла расширения файла класса.В вашем случае в вашем файле foo3.php может быть что-то вроде следующего:

<?php

require_once "foo.php";

class Foo3 extends Foo
{
    public function setFoo3($foo3) {
        $this->setFoo($foo3, "some foo3 specific value"); // calling superclass method
    }
}

, тогда вы можете создать экземпляр класса Foo3 в вашем запуске.php примерно так:

<?php

require_once "foo3.php";

$foo3 = new Foo3();
$foo3->setFoo3("bar");

и мой совет, вы должны прочитать немного о методах ООП;)

1 голос
/ 11 ноября 2011

Конечно, это не работает. Вы создали Foo объект, а затем попытались вызвать foo3 для него. Но Foo не имеет foo3 метода.

...