PHP, различать внутренний и внешний вызов метода класса - PullRequest
1 голос
/ 25 марта 2011

Не могу разобраться с этим, есть ли способ проверить, был ли метод вызван изнутри?Под этим я подразумеваю трассировку, чтобы проверить, был ли он вызван $ this, а не указатель на экземпляр.Вроде как концепция частной функции, но только функция является публичной?

<?php

class Foo {
    public function check () {
        /*
        if invoked by $this (internally)
            return true
        else
            return false
        */
    }

    public function callCheck () {
        /* returns true because its called by $this */
        return $this->check();
    }
}

$bar = new Foo;
// this should return false because we are calling it from an instance
$bar->check();
// where as this will return true
$bar->callCheck();

?>

Может быть, это невозможно, но мне действительно нужно это для моего проекта в университете?Кто-нибудь сталкивался с решением или знает, как я мог бы найти решение.

Спасибо.

Ответы [ 3 ]

1 голос
/ 25 марта 2011

Решение ниже не работает.


Вы можете использовать debug_backtrace , но это будет медленно.Я действительно советую вам найти другой способ решения проблемы, которую вы пытаетесь преодолеть.

<?php
public function check() {
    $trace = debug_backtrace();
    if ($trace[1]['class'] == 'MyClassName') {
        return true;
    }
    return false;
}
0 голосов
/ 25 марта 2011

debug_backtrace (); должно сработать. поместите debug_backtrace (); метод внутри check ().

сделать это:

$ t = debug_backtrace (); var_dump ($ т);

отсюда вы должны проверить $ t ['function'] и $ t ['class'], объединить эти 2, вы должны выяснить, является ли это вызовом, внешним или внутренним.

здесь поставлено с моей машины, версия php 5.2.14.

array(1) {
  [0]=>
  array(7) {
    ["file"]=>
    string(15) "C:\php\test.php"
    ["line"]=>
    int(24)
    ["function"]=>
    string(5) "check"
    ["class"]=>
    string(3) "Foo"
    ["object"]=>
    object(Foo)#1 (0) {
    }
    ["type"]=>
    string(2) "->"
    ["args"]=>
    array(0) {
    }
  }
}
array(2) {
  [0]=>
  array(7) {
    ["file"]=>
    string(15) "C:\php\test.php"
    ["line"]=>
    int(18)
    ["function"]=>
    string(5) "check"
    ["class"]=>
    string(3) "Foo"
    ["object"]=>
    object(Foo)#1 (0) {
    }
    ["type"]=>
    string(2) "->"
    ["args"]=>
    array(0) {
    }
  }
  [1]=>
  array(7) {
    ["file"]=>
    string(15) "C:\php\test.php"
    ["line"]=>
    int(26)
    ["function"]=>
    string(9) "callCheck"
    ["class"]=>
    string(3) "Foo"
    ["object"]=>
    object(Foo)#1 (0) {
    }
    ["type"]=>
    string(2) "->"
    ["args"]=>
    array(0) {
    }
  }
}
0 голосов
/ 25 марта 2011

если у вас есть вызов $ bar-> callCheck ();контроль завершается из функции check ();

сначала он переходит к callCheck (), а затем после проверки () и возврата оттуда

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