东东东 陈煜东的博客

月份存档: 六月 2013

Linux下编译安装qemu和libvirt

KVM虚拟机(英语:Kernel-based Virtual Machine),是一种用于Linux内核中的虚拟化基础设施。KVM目前支援Intel VT及AMD-V的原生虚拟技术。KVM在2007年2月被导入Linux 2.6.20核心中。它也被引入FreeBSD。在Mac OS X中,也可以见到KVM。

因为kvm已经集成到Linux中了,所有就不用安装kvm了。

安装qemu

qemu介绍

QEMU 是一个面向完整 PC 系统的开源仿真器。除了仿真处理器外,QEMU 还允许仿真所有必要的子系统,如连网硬件和视频硬件。它还允许实现高级概念上的仿真(如对称多处理系统(多达 255 个 CPU)和其他处理器架构(如 ARM 和 PowerPC)。

下载源文件

下面从git安装qemu最新版qemu官网的git地址:

http://git.qemu-project.org/qemu.git

使用以下命令下载qemu代码到本地来,将来可以用来自己编译和修改,然后发布自己新的qemu。

git clone git://git.qemu.org/qemu.git

编译安装

下载完后,进行编译安装.

### 如果你是从压缩包下载来的,先解压缩
cd /tmp
tar zxvf qemu-x.y.z.tar.gz
cd qemu-x.y.z
### Then you configure QEMU and build it (usually no options are needed):

###git下载及源码包下载都一样了
./configure
 make
### Then type as root user:

make install
### to install QEMU in /usr/local.

你可能在./courfigure出现问题

注意:可能在安装的时候,许多的软件没有安装,需要提前安装,不过会提示你会少了什么

yum install gcc
yum install zlib-devel.x86_64
yum install glib2-devel.x86_64
yum install pixman-devel.x86_64
git submodule update --init dtc   ###会提示缺某个模块,在当前的git目录下运行

安装libvirt

libvirt介绍

libvirt是目前使用最为广泛的对KVM虚拟机进行管理的工具和应用程序接口(API),而且一些常用的虚拟机管理工具(如virsh、virt-install、virt-manager等)和云计算框架平台(如OpenStack、OpenNebula、Eucalyptus等)都在底层使用libvirt的应用程序接口。

下载libvirt

git项目的位置http://libvirt.org/git/?p=libvirt.git

新建一个文件夹,存放git的文件

git clone git://libvirt.org/libvirt.git

编译安装

这部分是参考http://libvirt.org/compiling.html文章

###个人不推荐这个方法,见下面
$ ./autogen.sh --prefix=$HOME/usr
$ make
$ sudo make install

默认状态下,配置和编译后安装的目录与Linux操作系统发行版提供的默认目录可能是不一致的,例如:RHEL 6.3中用系统的RPM包安装的libvirtd、virsh等可执行程序被安装 /usr/sbin/ 目录下,libvirt.so、libvirt-qemu.so等共享库文件被安装在 /usr/lib64/ 目录下,而从前面步骤中可知自己编译安装时,默认会将libvirtd、virsh等安装在 /usr/local/sbin 目录下,而libvirt.so、libvirt-qemu.so 等被安装在 /usr/local/lib/ 目录下。如果想保持对操作系统发型版中安装可执行程序和共享库的目录的一致性, autogen.sh 脚本提供了“–system”参数,带有这个参数来配置,就会尽可能保证安装目录与原生系统的一致性,其命令行操作如下.

###个人推荐这个方法##保持对操作系统发型版中安装可执行程序和共享库的目录的一致性
$ ./autogen.sh --system
### 或者 ./configure --prefix=/usr --localstatedir=/var  --sysconfdir=/etc
$ make
$ sudo make install

安装libvirt可能也会缺少一些软件,比如

yum install libtool.x86_64
autopint : yum install gettext-devel.x86_64
python-config : yum install python-devel.x86_64
pciaccess : yum install libpciaccess.devel.x86_64

检查已经安装的libvirt

# which libvirtd
/usr/sbin/libvirtd

# which virsh
/usr/bin/virsh

参考资料

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: Linux下编译安装qemu和libvirt – https://www.chenyudong.com/archives/install-qemu-libvirt-in-fedora-linux.html

分类: 虚拟化

Hibernate session在service实现事务,getCurrentSession()和openSession()区别

当我们在使用Hibernate作为数据库操作的类库时,我们一般在DAO层里与数据库相关的操作,把业务逻辑写在service层里。但是如果我们的项目比较小,那么直接在dao层里写事务也是可以的,这个就是看个人了,没有什么特别的规定。但是如果项目比较大,那么DAO应该只做单纯的数据库的操作,service写事务的操作,即整个业务逻辑。

例如:业务逻辑要求向数据库中的用户表增加一个用户,同时向日志表中加入一条日志,而这需要调用DAO的两个方法(UserDao的saveUser和LogDao的saveLog)。这显然是一个事务,也就是如果一个操作出现了问题,就要回滚到初始的状态。那么如何在Service层控制事务呢,本文就以此例的代码说明。

在DAO进行Session事务出现的问题

我们先看看在DAO层里写Hibernate的session的事务。

package com.xxg;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();
    private static SessionFactory buildSessionFactory() {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            return new Configuration().configure().buildSessionFactory();
        }
        catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

创建用户表T_user(id,username)和日志表T_log(id,content),以及它们对应的实体类User、Log及映射文件,这里就不一一贴出代码。

public class UserDao {

    public void saveUser(User user){
        SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); //获取SessionFactory
        Session session = sessionFactory.openSession();// openSession
        session.beginTransaction(); //开始事务

        session.save(user);

        session.getTransaction().commit(); //事务提交
        session.close(); //关闭session
    }
}
public class LogDao {

    public void saveLog(Log log){
        SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); //获取SessionFactory
        Session session = sessionFactory.openSession();// openSession
        session.beginTransaction(); //开始事务

        session.save(log);

        session.getTransaction().commit(); //事务提交
        session.close(); //关闭session
    }

}

接下来我们看看在service中写一个业务逻辑

public class TestService {

    public void save(User user){
        UserDao userDao = new UserDao();
        userDao.saveUser(user);

        LogDao logDao = new LogDao();
        Log log = new Log();
        log.setContent("插入一个用户");
        logDao.saveLog(log);
    }

}

可以看到,我们在两个DAO里写了数据库的事务,代码中高亮显示了,session.beginTransaction()显示声明事务的开始。

这样写是不对的,因为这两个事情作为一个事务来进行的,会出现一个事务成功提交,而另外一个可能提交失败,导致不一致的情况,这样这两个操作不算是一个事务transaction,所以这么写就是一个失败的事务。

因此,我们要将事务在service中进行声明。

在service层写session的数据库事务

为了将事务放在service中,我们需要更改HibernateUtil的代码才能实现。否则使用上面的那个不能达到我们的需求。在这个新的HibernateUtil代码中,利用了ThreadLocal的线程内的局部变量来保存hibernate的session对象。这样就可以在不同的class中使用同一个session对象,而不用传递参数。

public class HibernateUtil {
    public static final ThreadLocal session = new ThreadLocal();

    public static final SessionFactory sessionFactory;
    static {
        try {
            sessionFactory = new Configuration().configure().buildSessionFactory();
        } catch ( Throwable ex ) {
            throw new ExceptionInInitializerError( ex );
        }
    }

    public static Session currentSession() throws HibernateException
    {
        Session s = session.get();
        if ( s == null )
        {
            s = sessionFactory.openSession();
            session.set( s );
        }
        return(s);
    }

    public static void closeSession() throws HibernateException
    {
        Session s = session.get();
        if ( s != null )
        {
            s.close();
        }
        session.set( null );
    }
}

接下来,我们将事务放在service中。看代码:

public class TestService {

    public void save(User user){

        SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); //获取SessionFactory
        Session session = sessionFactory.getCurrentSession();//getCurrentSession
        session.beginTransaction();//事务开始

        UserDao userDao = new UserDao();
        userDao.saveUser(user);

        LogDao logDao = new LogDao();
        Log log = new Log();
        log.setContent("插入一个用户");
        logDao.saveLog(log);
        session.getTransaction().commit();//事务提交
    }

}

 

public class LogDao {

    public void saveLog(Log log) throws RuntimeException{
        SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); //获取SessionFactory
        Session session = sessionFactory.getCurrentSession(); //getCurrentSession

        session.save(log);

        throw new RuntimeException();
    }
}

 

public class UserDao {

    public void saveUser(User user){
        SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); //获取SessionFactory
        Session session = sessionFactory.getCurrentSession();//getCurrentSession

        session.save(user);

    }

}

通过getCurrentSession()可以获得当前线程的session对象,通过它来进行共享session。这样事务就从service开始,然后再service结束。

getCurrentSession()与openSession()区别

getCurrentSession创建的session会和绑定到当前线程,而openSession不会。

getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭

采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession() 创建的session则不会 * 采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession() 创建的session必须手动关闭

2、使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:

  • 如果使用的是本地事务(jdbc事务) <property name=”hibernate.current_session_context_class”>thread</property>
  • 如果使用的是全局事务(jta事务) <property name=”hibernate.current_session_context_class”>jta</property>

getCurrentSession()与openSession()关联

在 SessionFactory 启动的时候, Hibernate 会根据配置创建相应的 CurrentSessionContext ,在 getCurrentSession() 被调用的时候,实际被执行的方法是 CurrentSessionContext.currentSession() 。在 currentSession() 执行时,如果当前 Session 为空, currentSession 会调用 SessionFactory 的 openSession 。所以 getCurrentSession() 对于 Java EE 来说是更好的获取 Session 的方法。

参考资料

  • http://blog.csdn.net/xiao__gui/article/details/7695698
  • http://blog.csdn.net/loveyout/article/details/4193894

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: Hibernate session在service实现事务,getCurrentSession()和openSession()区别 – https://www.chenyudong.com/archives/hibernate-session-transaction-in-service-not-dao.html

分类: JavaEE

给高三毕业生关于报考计算机与软件工程专业

高三的毕业生们,你们经过了一阵紧张的高考和一段焦急的等待分数,可以开始报考学校和志愿了。

本文目标读者 – 高三毕业生

也许你现在还在纠结应该报考什么方向,如果你想报考计算机科学与技术(CST:Computer Science and Technology)专业或者软件工程(SC:Software Engineering)专业,那么这篇文章可能对你有些用处。

如果你不知道你应该是报什么专业、或者你的分数与你理想的专业还有一点点的差距,这篇文章会稍微有那么些用处,因为可能你会面临专业调剂(即分数线达到了学校线,但是专业线没有达到,只能取一下个专业)的可能。而大部分的人会被调剂到软件工程。

报考计算机还是软件?

可能你在网上看到过计算机科学与技术就业被亮红灯或者红牌,你可能会产生一个恐惧的心理,另外你可能会看到软件工程的学费居然需要¥16000!这都不是重点,重点是你喜不喜欢计算机或者软件。

如果你的分数不够,很有可能会被调剂软件工程,不为什么,就因为这个专业的学费贵!报名的人少。所以你报名的时候还是报考计算机专业吧。

如果你将来想要工作,那么软件工程比较注重实践因为是一个工科,计算机科学可以作为一个理科来理解。公司的人还是比较喜欢偏实践的人的。

计算机与软件工程的区别

计算机科学与技术这个专业相比软件工程看到的会比较多一些。

  • 首先,除了本科的院校有开设这个专业,高职高专、职业技术学校也会开设这个专业,所以见的就比较多了
  • 其次,计算机科学这个名词用的比较多,可以算是一个统称吧,不懂计算机的人,也可能知道计算机或者计算机科学,而不知道软件工程。
  • 软件工程一般用的比较少,因为它可以算是计算机科学技术的一个子集吧。
  • 软件工程软件工程专业是2002年国家教育部新增专业。是一个新的专业,知道的人还可能比较少,
  • 软件工程是一个开设的学校比较少,一般是一本学校开设,特别是211院校。但学费比较贵。

有相同的地方么?

相同的地方肯定是有的。

第一,这两门课的开设是差不多的,大约有90%是相同的,因为这些都是计算机的基础知识。只是偏重不一样。在我眼里,开设的课程没什么区别,因为你可以自己去蹭课。

第二,软件工程很可能是大四的时候,需要你去公司里进行实习,而不用呆在学校里学习。计算机专业的人需要呆在学校里。这是最大的区别。

软件工程

软件工程的兴起要根源于1960年代,1970年代和1980年代的软件危机。在那个时代,许多软件最后都得到了一个悲惨的结局,软件项目开发时间大大超出了规划的时间表。一些项目导致了财产的流失,甚至某些软件导致了人员伤亡。同时软件开发人员也发现软件开发的难度越来越大。在软件工程界被大量引用的案例是Therac-25的意外:在1985年六月到1987年一月之间,六个已知的医疗事故来自于Therac-25错误地超过剂量,导致患者死亡或严重辐射灼伤。

从这个起源可以看出,软件工程的出现是因为软件的开发出现了危机,才开始有软件工程的。软件工程是研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来的学科。它涉及到程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等方面。通俗的讲就是如何写一个可维护的程序。

在我们学校,软件工程属于软件学院,软件学院是计算机学院的一部分。你也可以这么理解,软件工程只是计算机的一个子集。

计算机科学与技术

计算机科学是系统性研究信息与计算的理论基础以及它们在计算机系统中如何实现与应用的实用技术的学科。作为一个学科,计算机科学涵盖了从算法的理论研究和计算的极限,到如何通过硬件和软件实现计算系统。

    理论计算机科学
  • 计算理论
  • 信息与编码理论
  • 算法
  • 程序设计语言理论
  • 形式化方法
  • 并发,并行和分布式系统
  • 数据库和信息检索
    应用计算机科学
  • 人工智能
  • 计算机体系结构与工程
  • 计算机图形与视觉
  • 计算机安全和密码学
  • 计算科学
  • 信息科学
  • 软件工程

正式因为这个学科比较大,所以里面还有分好多的方向。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 给高三毕业生关于报考计算机与软件工程专业 – https://www.chenyudong.com/archives/to-high-school-graduates-about-coumputer-and-software-engineering.html

分类: 生活

你拍照是眼睛注视哪里?

当你在拍照的时候,你的眼睛会注视哪里呢?是摄像机?还是摄影师?还是其他的地方?

我一个同学突然问我,我拍照的时候,眼睛看摄像头吗?于是他说他看到许多古今名人一般不看镜头。我就纳闷了,这是怎么个情况。

看看名人们往哪里看

马云的照片,不看镜头

于是他发了个图片过来,看了马云的照片,身子是朝前的,但是眼睛确实看其他的地方。

曾仕强朝前方看

这个照片眼睛是朝前看的,看来并不是拍照都不看镜头的。

再来看看我们的国家领导人,感觉习近平同志没有看镜头,身体是侧着的,胡锦涛同志眼睛感觉是看镜头了,身体是侧着的,毛泽东同志应该没有看镜头,身体是侧着的。

国家领导人的照片,习近平同志没有看镜头,身体是侧着的,胡锦涛同志眼睛感觉是看镜头了,身体是侧着的,毛泽东同志应该没有看镜头,身体是侧着的。

再来看看清朝皇帝康熙爷的画像,朝服的画像是一个正面的画像,还有一个是读书侧面的画像。

康熙画像,皇帝朝服像和看书的画像。一个正面,一个侧身

人物像的规律及我们的小结论

我们可以得小规律:

这些人拍照,眼睛看镜头,身体侧着的;或者眼睛看其他的地方,身体朝前。 古代皇帝、大臣在严肃的场景采用正面照。休闲的环境使用侧面照。

感觉在拍个人照片的时候,如果是侧身或者侧脸比较自然些,比较亲近一些。而如果是正面照,那么就觉得比较严肃了。

我们的讨论结果是,拍个人照,采用侧身或者侧脸。拍集体照看镜头。

附文一

影视拍摄角度的选择包括拍摄方向和拍摄高度的选择。拍摄角度的选择在人物摄影中十分重要。拍摄角度的稍微变化就会对被摄者的形象和姿态产生明显的影响。

拍摄方向的选择是指以被摄者为中心,照相机在水平位置上的前、后、左、右位置的变化。有时候也可以请被摄者改变方向,以获得不同方向的拍摄效果。在人物摄影中对拍摄方向的选择主要有以下几种:

正面角度 采用正面的方向拍摄人物,能很好地表现被摄者正面特征,人物面部的各部分都处在相等的对称位置,给人以安静、庄严、肃穆之感。

前侧面角度 这个拍摄方向是人物摄影中最常采用的,因为这个拍摄方向不仅能表现出被摄者的正面结构和侧面结构,还能很好地表现出这两个面相结合的棱线,使被摄者的形象、轮廓和立体效果得到充分的表现。这种方向拍摄的人物在画面中的各部分不是处在同等地位,所以,画面中的影相显得活泼,富有变化,整个画面具有动势和较明显的方向性。

侧面角度 拍摄时照相机正对着被摄者的侧面进行拍摄,以表现出被摄者的侧面形象,线条结构。由于这个方向拍摄对被摄者的侧面轮廓能得到充分的表现,所以在拍摄剪影人物照片时,也多采用这个拍摄方向。同时侧面拍摄具有强烈的动势和方向性,所以,在拍摄高速向前运动的人物时,也多采用侧面方向拍摄。

背面角度 在人物摄影中,从被摄者的背后方向拍摄是很少的,只在一些特殊的情况下才采用。背面拍摄能显示出被摄者的背面特征和引导观众的视线向纵深发展的作用。在选择背面方向拍摄人物时,一定要注意被摄者的背面要有特点。 在拍摄方向不变的前提下,改变拍摄的高度会使所摄的画面透视关系发生改变。在人物摄影中,由于高度的变化,常常会出现以下几种拍摄角度。

仰摄 采用低角度仰摄人物,能表现出被摄者的高大形象,同时还具有净化背景的作用。仰摄人物全身照片,能表现出被摄者修长的腿,对于上小下大脸形的人不宜采用正面角度仰摄,以免过分地暴露其不足。

平摄 是指以被摄者直立时眼镜平视的高度为准的。平视拍摄角度所拍摄的画面中各部分景物的透视关系,符合于正常人们视觉观看的心理,构图平稳,无特殊的变化。

俯摄 在人物的近景拍摄时,如果采用高度俯摄容易形成上大下小的变形。在拍摄少女时,采用这种角度拍摄容易形成美丽的“瓜子脸”型效果。对于那些脸形较宽,较胖的女性,可以选择这个高度进行拍摄;但对于那些较瘦,脸形上大下小的秃顶的人,则不宜采用这个角度拍摄。在拍摄全身照时,一般也不要采用这种角度拍摄。

在这里还应该指出,在人物摄影中,选择不同的拍摄角度,会使所拍摄的人物照片产生不同的构图艺术效果。对于拍摄高度的选择应根据被摄者的具体情况和自己的创作艺术构思来确定。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 你拍照是眼睛注视哪里? – https://www.chenyudong.com/archives/where-the-eyes-focus-in-the-picture.html

分类: 生活

多人远程桌面共享软件Real VNC – 支持Windows/Linux/Mac

在培训上,当没有投影仪怎么办?那就是用每个人的计算机屏幕当屏幕吧。这就是桌面共享软件。通过分享自己的屏幕给大家,让大家一起看,达到多人共享桌面的效果。

VNC(Virtual Network Computing),为一种使用RFB协定的屏幕画面分享及远程操作软件。此软件借由网络,可传送键盘与鼠标的动作及实时的屏幕画面。VNC与操作系统无关,因此可跨平台使用,例如可用Windows连接到某Linux的电脑,反之亦同。甚至在没有安装客户端程序的电脑中,只要有支持JAVA的浏览器,也可使用。 –via Wikipedia

由于VNC以GPL授权,派生出了几个VNC软件:RealVNC(分为全功能商业版及免费版)、TightVNC(强调节省带宽使用)、UltraVNC(TightVNC仅有Windows版本)、Vine Viewer(MacOSX的VNC客户端)

Real VNC 查看远程桌面

今天介绍一个软件RealVNC,就是这个软件允许用户访问其他人的桌面并控制其桌面。目前,这款软件支持Windows 32/64bit、Linux 32/64bit、Mac OS X、Solaris、HP-UX、AIX。至于查看器(即连接VNC服务器的软件)却有很多了,有Windows 32/64bit、Linux 32/64bit、Mac OS X、Solaris、HP-UX、AIX 、VNC Viewer for iOS、VNC Viewer for Android、VNC Viewer for Chrome,多的很啊。

RealVNC目前最新版本为5.0.5,它分免费版、专业版和企业版。企业版即RealVNC Enterprise,收费的,也有更强大的功能。免费版远程控制为个体私营使用,不包含会话加密,还没有包含在个人和企业的高级功能。而企业版是全功能、超安全、易管理的远程控制个人和中型和大型的商业用途。

我们可以利用VNC可以来干一下事情,一个VNC服务器,一个客户端

  • 将我们的桌面远程分享给好友
  • 好友控制我们的桌面
  • 我们控制好友的桌面

另外提供一个专业版注册码H322B-2B225-XR3S9-BGVXZ-9674A,这个可以注册有效期可以到2024年4月24号,很长了,有10年之久。

VNC(包含VNC Viewer)的下载地址:百度网盘 | QQ分享 | 官网:https://www.realvnc.com/download/vnc/

VNC Viewer(查看对方客户端)下载地址:官网下载https://www.realvnc.com/download/viewer/

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 多人远程桌面共享软件Real VNC – 支持Windows/Linux/Mac – https://www.chenyudong.com/archives/vnc-remote-share-desktop-screen-windows-linux-mac.html

分类: 软件

php声明(静态)字符串成员变量要注意的地方

PHP在声明一个成员变量时,你可能会遇到以下问题。

这是一个从Java迁移过来的程序员犯的错误。很悲剧,花了许多时间来解决。

遇到情况

我们先来看看,正确的定义一个成员变量。如果学过其他的语言,我们很快就会发现,这样的结构我们是很熟悉的。

class Test{
    public $a = "ab";
}

接下来,我们定义的字符串比较长,需要采用字符串的拼接来进行。如果改成这样的命名,将abcd拼接在一起,这样就报错了,说语法错误。

<?php

class Test{
    public $a = "ab"."cd";
}

$t = new Test();
echo $t->a;
?>

会出现错误

Parse error: syntax error, unexpected '.', expecting ',' or ';' in ..../test.php on line 4

也许,你曾今见过这样的拼接字符串,而且能够正确运行。

$str = "ab"."cd";
echo $str;

而且如果你知道Java语言声明成员变量,那么知道一下定义没问题。

class Test{
    String str="ab"+"cd";
}

从Java的风格到PHP的风格,于是就杯具了。完全不对。看着php中的定义一个字符串没问题,但是在成员变量中就报错误。

原因 – 解释

后来在http://stackoverflow.com/questions/4976717/static-function-variables-and-concatenation-in-php上发现了这个问题的解决。

说了static的静态变量,是不运行进行赋值表达式的,只能使用 literal和const。

同样的,属性中的变量可以初始化,但是初始化的值必须是常数,这里的常数是指 PHP 脚本在编译阶段时就可以得到其值,而不依赖于运行时的信息才能求值。即成员初始化只能使用简单类型(字符串,整形,数组等),不能有函数和运算符。详情请见:http://php.net/manual/zh/language.oop5.properties.php

另外,使用var声明一个成员变量新版本已经废弃了。如果看代码看到这样的,千万不要这样学习。

解决

通过define方法解决。

define('str' ,"ab"."cd");

class Test{
    public $a = str;
}


$t = new Test();
echo $t->a;

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: php声明(静态)字符串成员变量要注意的地方 – https://www.chenyudong.com/archives/php-declare-static-member-variable-with-string.html

分类: PHP

Java Interface声明成员变量应该要注意的东西

Java中的Interface是声明一个接口类型。而实现这个接口的类需要实现它的方法。外界可以通过多态行为来进行调用。但是一般很少在interface中定义成员变量。

public interface Interface{
    int width =10;
}

在Interface中声明成员变量width,那么在外部的类是可以直接调用这个变量的。外界只要使用I.width就可以调用了。

我们可以看到,在声明中,我们没有添加public static的关键字,但是Java在编译完成后,会将Interface中的成员变量自动使用public static final关键字来修饰。而方法会使用public关键字来修饰。

所以大家在声明Interface中要注意以下,虽然可以省略,但是最好还是添加上,这样一看就很直观,不会造成不良的影响。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: Java Interface声明成员变量应该要注意的东西 – https://www.chenyudong.com/archives/java-interface-field-member-variable.html

分类: Java

Copyright © 2017 东东东 陈煜东的博客 粤ICP备13059639号-1

SITEMAP回到顶部 ↑