Невозможно переопределить класс / функцию PHP - PullRequest
3 голосов
/ 19 июля 2011

Я не могу переопределить функцию в дочернем классе на моем локальном тестовом сервере LAMP Ubuntu, но тот же самый код приводит к желаемому переопределению при загрузке на веб-сервер.*

class HandsetDetection {
    function HandsetDetection() {
        //code I wish to replace
    }
}

Мой класс:

class HandsetDetection_RespondHD extends HandsetDetection {
    function HandsetDetection() {
        //code I wish to use
    }
}

Конструкторы не задействованы.

Версия PHP, используемая на моей локальной машине, - PHP 5.3.3-1ubuntu9.5 с Suhosin-Patch (cli) (построено: 3 мая 2011 г. 00:48:48)

Версия PHP на веб-сервере, где переопределение успешно, - 5.2.17

Вы можете подумать, почему это может быть?

Ответы [ 2 ]

11 голосов
/ 19 июля 2011

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

Это стиль php4 Конструктор .

КакПока класс не находится в пространстве имен, которое все еще является проблемой.

Для обратной совместимости, если PHP 5 не может найти функцию __construct () для данного класса, он будет искать старыйфункция конструктора стиля, по имени класса.По сути, это означает, что единственный случай, когда возникнут проблемы совместимости, - это если у класса есть метод с именем __construct (), который использовался для другой семантики.


Пример:

<?php


class A {

    function A() {
        echo "construct";
    }
}

class B extends A {

    function A() {
        echo "override";
    }

}

$x = new B();

Это выдаст "construct"

Теперь вызов

$x->A();

выдаст "override".

2 голосов
/ 19 июля 2011

Замените HandsetDetection() / предотвратите его вызов, дав расширяющему классу метод конструктора ( Демо ):

<?php

class A {

    function A() {
        echo "A() constructor\n";
    }
}

class B extends A {

    function __construct() {
        echo 'B() constructor', "\n";
    }

    function A() {
        echo "override\n";
    }

}

$x = new B();

Тогда все должно получиться хорошо. Объяснение справочной информации см. В ответе @edorians со ссылками на руководство и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...