【问题标题】:php - Why calling static methods from sibling classes does not work without instantiation?php - 为什么从兄弟类调用静态方法在没有实例化的情况下不起作用?
【发布时间】:2015-09-07 08:50:55
【问题描述】:

我有一个用于数据库元素的通用父 item 类,例如

class item {
    function set($i = '') {
        //set element in database
    }

    function get($id = '') {
        //get element in database
        return $item;
    }
}

我有不同的类来实现项目的父项,例如 usersevents - 当我在用户内部调用 set 方法来处理类事件时,例如

class users extends item {
    function dothis() {
        events::set(array('start' => 'today', 'end' => 'tomorrow'));
    }
}

就像我写的一样

class users extends item {
    function dothis() {
        self::set(array('start' => 'today', 'end' => 'tomorrow'));
    }

}

试图在用户表中插入事件,所以我必须以这种方式实例化类

class users extends item {
    function dothis() {
        $e = new events();
        $e->set(array('start' => 'today', 'end' => 'tomorrow'));
    }

}

我做错了吗?有没有办法避免实例化?

编辑 - 我的框架中的所有类都以静态方式调用,不需要 new$this,而且效果很好。

【问题讨论】:

  • All the classes in my framework are called in a static way ... it works perfectly - 显然不是 =)。
  • @GiobiFasoli static 关键字不是可选的。您目前正在忽略(甚至可能不知道?)警告ala Non-static method Foo::set() should not be called statically - 打开错误报告; 总是在显示 E_ALL 的情况下进行开发。你在问题//get element in database中没有显示的代码就是问题所在,如果你想要一个具体的答案,显示一些具体的代码和一个具体的问题。
  • 我并不关心你重写代码,尽管认识到你已经遇到和正在创造的问题(例如,我将在生产中工作,甚至不会麻烦自己阅读错误日志)将符合您的利益。我关心你把问题变成可以回答的东西——你没有那样做。问题缺少重要的代码,并且不包含实际的问题陈述(我这样写的代码就像我写的那样是不是问题陈述它是对什么的猜测/解释实际发生,并没有帮助)。
  • :( 你没抓住重点 - 你无法通过编辑标题来解决我的 cmets。显示更多代码和一个实际问题。我试过了,祝你好运.
  • @deceze 作为记录,我正在阅读这篇文章,我明白了。我特别公开地向 AD7six 道歉,因为你太粗鲁了:你已经非常有耐心了!

标签: php class static parent siblings


【解决方案1】:

如果你想使用静态方法,你还应该像这样声明你的方法:

protected static function set($i = '') {

protected static function get($id = '') {

所以您可以致电self::set(...)self::get(...)

如果你想使用非静态方法,你只需要改变

self::set(...)

$this->set(...)

【讨论】:

  • 你会遇到关于使用self:: 的后期静态绑定的问题 - 你应该链接到 php 手册中的相关文档,没有静态关键字表示相当基本的误解/缺乏 -关于静态/实例方法/属性/概念的知识。
  • 我知道这一点,但我隐含地使用了所有内容,而无需表达受保护的静态。它只是在兄弟姐妹之间隐式调用方法失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
  • 2015-08-05
  • 2014-04-13
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
相关资源
最近更新 更多