小编Jon*_*han的帖子

PHP是否有Java样式类泛型的答案?

在用PHP构建MVC框架后,我遇到了一个问题,可以使用Java样式泛型轻松解决.抽象的Controller类可能如下所示:

abstract class Controller {

abstract public function addModel(Model $model);
Run Code Online (Sandbox Code Playgroud)

可能存在类Controller的子类只应接受Model的子类的情况.例如,ExtendedController应该只接受ReOrderableModel到addModel方法中,因为它提供了一个reRerder()方法,ExtendedController需要有权访问:

class ExtendedController extends Controller {

public function addModel(ReOrderableModel $model) {
Run Code Online (Sandbox Code Playgroud)

在PHP中,继承的方法签名必须完全相同,因此类型提示不能更改为其他类,即使该类继承了超类中提示的类类型.在java中我会这样做:

abstract class Controller<T> {

abstract public addModel(T model);


class ExtendedController extends Controller<ReOrderableModel> {

public addModel(ReOrderableModel model) {
Run Code Online (Sandbox Code Playgroud)

但PHP中没有泛型支持.有没有任何解决方案仍然符合OOP原则?

编辑 我知道PHP根本不需要类型提示,但它可能是糟糕的OOP.首先,从界面(方法签名)接收什么样的对象并不明显.因此,如果另一个开发人员想要使用该方法,那么显然需要类型为X的对象,而不必查看实现(方法体),这是一个糟糕的封装并打破了信息隐藏原则.其次,因为没有类型安全性,该方法可以接受任何无效变量,这意味着手动类型检查和遍布整个地方的异常抛出!

php java oop generics inheritance

33
推荐指数
3
解决办法
3万
查看次数

如何将Eclipse项目转换为早期的Java版本?

我在Eclipse中有一个项目,以前使用过JRE7并引用了JRE7系统库.我现在绝对需要它在JRE6中运行.我没有使用任何Java 7特定语法,因此源代码本身完全兼容.这是我已经做过的事情:

  • 我安装了JDK6.
  • 然后我转到Window> Preferences> Java> Installed JREs并将JRE6设置为默认值.
  • 我将项目的构建路径配置为引用JRE6系统库而不是JRE7系统库.
  • 最后,我转到Run Configurations> JRE并将其设置为在JRE6中运行.

在最后一步之后,对话的顶部会立即显示一条消息:

JRE与项目.class文件兼容性不兼容:1.7

当我运行该项目时,我收到此错误消息:

java.lang.UnsupportedClassVersionError: ExampleProcessingApp : Unsupported major.minor version 51.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:314)
    at sun.applet.AppletClassLoader.loadClass(AppletClassLoader.java:146)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
    at sun.applet.AppletClassLoader.loadCode(AppletClassLoader.java:608)
    at sun.applet.AppletPanel.createApplet(AppletPanel.java:798)
    at sun.applet.AppletPanel.runLoader(AppletPanel.java:727)
    at sun.applet.AppletPanel.run(AppletPanel.java:380)
    at java.lang.Thread.run(Thread.java:679)
Run Code Online (Sandbox Code Playgroud)

正如我之前提到的,项目的实际代码与Java 6语法没有区别,因此它将在JRE6中运行.所以我可能需要以某种方式重新编译源代码中的所有.class文件.我以为Eclipse会自动执行此操作.有任何想法吗?

java eclipse backwards-compatibility

22
推荐指数
2
解决办法
3万
查看次数

Java从MIDI键盘获取输入

我在java中设计了自己的合成器,现在我想用midi键盘连接它.我的下面的课程搜索所有具有发射器的midi设备.它成功找到我的midi键盘.我为每个设备添加了自己的接收器到每个发射器,以便它可以拾取所有可能的东西.通过阅读所有帮助文档和java doc,我知道Transmitter将MidiEvents发送给Receiver,然后Receiver使用send方法处理它们.所以我编写了自己的内部类,实现了Receiver,并使用了println语句来检查send方法中是否有任何检测到的内容.但是根本没有任何东西被拿走.做这么简单的事似乎没什么帮助,我看了每个帮助文件,javadoc和论坛.我敢肯定它一定是非常明显我不知何故错过的东西.

我的合成器不应该与接口合成器混淆,它不是midi乐器.它使用合成算法并具有回放方法.基本上我只需要让midi键盘发送一个关于事件的注释,它将调用回放方法.

import javax.sound.midi.*;
import java.util.ArrayList;
import java.util.List;
import java.io.*;
public class MidiHandler
{
    //ArrayList of MidiDevices
    private ArrayList<MidiDevice> devices = new ArrayList<MidiDevice>();

    public MidiHandler()
    {
        MidiDevice device;
        MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
        for (int i = 0; i < infos.length; i++) {
            try {
                device = MidiSystem.getMidiDevice(infos[i]);
                //does the device have any transmitters?
                if (device.getTransmitters().size() > 0) {
                    //if it does, add it to the device list
                    System.out.println(infos[i] + ": " + device.getTransmitters().size());
                    devices.add(device);
                }
            } catch (MidiUnavailableException e) …
Run Code Online (Sandbox Code Playgroud)

java keyboard midi input javasound

11
推荐指数
1
解决办法
2万
查看次数

MySQL创建限制值出现量的列

我目前正在开发PHP和MySQL的架构,并且出现了一个问题.我希望这不是一个荒谬的问题,但如果有答案的话会非常有帮助.

以下是实际情况的简化版本.假设我有一个包含3列代表多个位置的表.每个位置都可能是默认位置:

location_id int(20), location_name varchar(255), is_default BOOL
Run Code Online (Sandbox Code Playgroud)

is_default应仅具有值true(1)或false(0).另外,我想确保只有一行可以将is_default设置为true.换句话说,我想允许最多一个真值和一个无限量的假值:

+-------------+---------------+------------+
| location_id | location_name | is_default |
+-------------+---------------+------------+
|1            |'England'      |1           |
|2            |'America'      |0           |
|3            |'China'        |0           |
|4            |'Russia'       |0           |
+-------------+---------------+------------+
Run Code Online (Sandbox Code Playgroud)

这个想法是只有一个位置可以是默认位置.有没有办法将此表达为某种数据类型或列属性?或者我是否必须通过简单地运行两个查询来强制执行php中的规则,以便每当添加其is_default列为true的位置时,旧的默认位置为is_default column = false?如果有一种方法可以在MySQL中强制执行它,那将会很棒.

这似乎是一个简单的问题,我认为它很常见,但我似乎无法在互联网上的任何地方找到答案,包括MySQL参考.除非有一些明显的数据库设计缺陷,我已经设法忽略了.

php mysql database database-design

2
推荐指数
1
解决办法
123
查看次数